알고리즘/코딩테스트-Programmers

[Programmers] 서버 증설 횟수 JAVA

kwang2134 2025. 3. 19. 16:10
728x90
반응형
728x90

[Programmers] 서버 증설 횟수 - LV 2 


접근


풀이

2025 코드챌린지 2차 예선 문제로 게임 서버가 증설되는 횟수를 구하는 문제이다. 게임을 이용하는 사람이 m 명 늘어날 때마다 서버가 증설되고 k 시간 동안 유지된다. 각 시간대마다 게임을 이용하는 사람의 수가 주어지고 총 서버 증설 횟수를 구하는 문제인데 m 명 이상의 사람이 접속하는 경우 서버가 증설되어 m 명 미만의 경우 서버가 증설되지 않는 부분을 잘 체크하면 된다. 

    public int solution(int[] players, int m, int k) {
        int count = 0;
        Queue<Integer> active = new LinkedList<>();

        for (int i = 0; i < 24; i++) {
            int need = players[i] / m;

            while (!active.isEmpty() && active.peek() <= i) {
                active.poll();
            }

            int current = active.size();

            if (current < need) {
                int newServer = need - current;
                count += newServer;
                for (int j = 0; j < newServer; j++) {
                    active.offer(i + k);
                }
            }
        }

        return count;
    }

큐를 사용해 현재 가동중인 서버를 보관했다. 주어지는 players 배열은 24시간의 이용 고객수가 들어있는 배열로 크기가 24로 고정이다. 각 시간마다 필요한 총서버의 개수를 구하는데 m 명 미만인 경우 서버 증설이 필요 없으므로 사람 수 / m을 해주면 필요한 서버의 개수가 구해진다. 필요한 서버의 개수와 현재 가동 중인 서버 개수와 비교해 부족하다면 서버를 증설하고 부족하지 않다면 넘어가는 방식이다. 새로운 서버는 생성 시점(i)을 기준으로 유지 시간인 k를 더한 i + k의 값으로 큐에 넣고 큐의 peek가 i보다 작거나 같다면 서버의 유지 기간이 끝났다는 뜻으로 해당되는 서버들을 큐에서 제거해 준다. 


전체 코드

import java.util.*;

class Solution {
    public int solution(int[] players, int m, int k) {
        int count = 0;
        Queue<Integer> active = new LinkedList<>();

        for (int i = 0; i < 24; i++) {
            int need = players[i] / m;

            while (!active.isEmpty() && active.peek() <= i) {
                active.poll();
            }

            int current = active.size();

            if (current < need) {
                int newServer = need - current;
                count += newServer;
                for (int j = 0; j < newServer; j++) {
                    active.offer(i + k);
                }
            }
        }

        return count;
    }
}
728x90