본문 바로가기
Beakjoon&프로그래머스/Java

[프로그래머스/Java] 서버 증설 횟수

by 현장 2026. 4. 7.

-Code

import java.util.*;

class Solution {
    static class Server {
        int startTime, cnt, operateTime;

        public Server (int startTime, int cnt, int operateTime) {
            this.startTime = startTime;
            this.cnt = cnt;
            this.operateTime = operateTime;
        }
        // 종료된 서버인지 확인
        public boolean isClose (int time) {
            return startTime + operateTime <= time;
        }
    }
    
    public int solution(int[] players, int m, int k) {
        Deque<Server> colseTimes = new ArrayDeque<>();
        int answer = 0;
        int serverCnt = 0;
        for (int i = 0; i < 24; i++) {
            // 운영 시간이 끝난 서버가 있는지 확인
            if (!colseTimes.isEmpty() && colseTimes.peekFirst().isClose(i)) {
                // 운영 시간 끝난 서버 제거
                Server closeServer = colseTimes.pollFirst();
                serverCnt -= closeServer.cnt;
            }
            // 서버 증설해야 하는지 확인
            int playerCnt = players[i];
            int needServer = playerCnt / m;
            // 필요 서버가 현재 서버보다 많은 경우
            if (needServer > serverCnt) {
                // 열린 서버 차이만큼 추가
                int serverGap = (needServer - serverCnt);
                serverCnt += serverGap;
                colseTimes.addLast(new Server(i, serverGap, k));
                answer += serverGap;
            }
        }
        return answer;
    }
}

처음에 서버 증설 확인 후 제거로 로직을 짰으나 틀렸습니다. 그래서 찾아보니 제거를 하고 추가해야 하는데 반대로 하여 해당 시간에 추가를 안 하고 넘어가는 경우가 생겨서 증설 횟수가 꼬인 문제였습니다. 그래서 if문의 위치를 바꾸니 해결되었습니다.