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
'알고리즘 > 코딩테스트-Programmers' 카테고리의 다른 글
[Programmers] 아이템 줍기 JAVA (0) | 2025.05.07 |
---|---|
[Programmers] 완전범죄 JAVA (0) | 2025.04.14 |
[Programmers] 택배 상자 꺼내기 JAVA (0) | 2025.03.13 |
[Programmers] 지게차와 크레인 JAVA (0) | 2025.03.07 |
[Programmers] 비밀 코드 해독 JAVA (0) | 2025.03.06 |