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;
}
}
}