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

  • 무한 루프가 발생해서 애먹음

서버 증설 조건 체크 오류

while(!(serverQueue.size() <= processingPlayerCount && processingPlayerCount < serverQueue.size()+1)){     
	serverQueue.add(new Server(time,k));     
	++serverAddCount; 
}

조건을 이렇게 적으면 사실상 무한루프에 빠지기 쉽고, 서버 수가 딱 맞아도 루프가 도는 문제가 있어.

올바른 로직은 이렇게 되어야 해:

  • 현재 실행 중인 서버 수 → serverQueue.size()
  • 필요한 서버 수 → neededServerCount

필요한 서버 수가 현재 서버보다 많으면 그 차이만큼 증설해야 해.

int diff = neededServerCount - serverQueue.size(); 
for (int j = 0; j < diff; j++) {     
	serverQueue.add(new Server(time, k));     
	serverAddCount++; 
}

정답 코드

import java.util.*;
 
class Solution {//3n <= 이용자 <(n+1)3 n <= user/3 < n+1
    public int solution(int[] players, int m, int k) {
        /*
        m 명 늘때마다 서버 1대씩 추가
        m 명 미만이면 서버 증설 불필요
        n*m <= user_count < (n+1)*m -> 최소 n대의 서버 필요
        한번 증설된 서버는 k 시간 동안 운영 후 반납
            10시에 증설된 서버는 10~15
        players.length 는 24
        players 원소는 곧 그 시간대 이용자 수
        */
        //최소 서버 증성 횟수는?
        int serverAddCount = 0;
        Queue<Server> serverQueue = new LinkedList<>();
        
        for(int i=0;i<24;i++){
            int time = i;
            int playerCount = players[i];
            while(!serverQueue.isEmpty() && serverQueue.peek().dieTime == time){
                serverQueue.poll();
            }
            int neededServerCount = playerCount/m;
            if (neededServerCount > serverQueue.size()) {
                int diff = neededServerCount - serverQueue.size();
                for (int j = 0; j < diff; j++) {
                    serverQueue.add(new Server(time, k));
                    serverAddCount++;
                }
            }
            // while(!(serverQueue.size() <= processingPlayerCount && processingPlayerCount < serverQueue.size()+1)){
            //     serverQueue.add(new Server(time,k));
            //     ++serverAddCount;
            // }
//             if(runningServerCount <= processingPlayerCount && processingPlayerCount < runningServerCount+1){
//                 continue;
//             }else{
//                 //증설해야됨
//                 while(!(serverQueue.size() <= processingPlayerCount && processingPlayerCount < serverQueue.size()+1)){
//                     serverQueue.add(new Server(time,k));
//                     ++serverAddCount;
                    
//                 }
//             }
        }
        return serverAddCount;
    }
    
    static class Server{
        int dieTime;
        Server(int startTime, int k){
            this.dieTime = startTime + k;
        }
    }
}