본문 바로가기
Algorithm/Programmers Java

[JAVA] 프로그래머스 LEVEL2 서버 증설 횟수

by 제우제우 2025. 2. 17.

https://school.programmers.co.kr/learn/courses/30/lessons/389479

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

코딩테스트 연습 > 2025 프로그래머스 코드챌린지 2차 예선 > 서버 증설 횟수

 

난이도: LEVEL2

알고리즘 유형: 구현?

문제 접근 

우선순위 큐에 증설된 서버를 넣어준다.

우선순위 큐는 int [] 배열을 가진다.

int [0] = 서버의 만료 시간 (서버 증설 시간 + k) int [1] = 증설된 서버의 개수

우선순위 큐는 만료 시간이 빠른 순서대로 정렬한다

players 배열 (0 ~ 23) for문을 돌면서 증설된 서버가 만료되면 내려주고 서버의 개수가 부족하면 늘려준다. 

그리고 count 변수에 서버 증설 횟수를 기록한다.

주석에 변수의 의미와 각 동작을 설명했으니 금방 이해할 것이다!

 

오토 스케일 아웃 알고리즘을 구현한 느낌..?

정답 코드

import java.util.*;
class Solution {
    public int solution(int[] players, int m, int k) {
        PriorityQueue<int[]> pq = new PriorityQueue<>((o1,o2) -> o1[0] - o2[0]);
        int size = 0;  // 현재 서버의 개수 
        int count = 0; // 증설된 서버 횟수  
        for(int i = 0; i < 24; i++){
            // 만료된 서버 내리기 
            while(!pq.isEmpty() && pq.peek()[0] == i){
                size -= pq.poll()[1];
            }
            int need = players[i] / m;  // 현재 필요한 서버의 개수 
            int more = size - need;     // - 서버 증설 개수  
            if(more < 0){
                more = -more;
                size  += more;
                count += more;
                pq.add(new int []{i + k, more});
            }
        }
        return count;
    }
}