문제 출처
https://school.programmers.co.kr/learn/courses/30/lessons/389479
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제 설명
당신은 온라인 게임을 운영하고 있습니다. 같은 시간대에 게임을 이용하는 사람이 m명 늘어날 때마다 서버 1대가 추가로 필요합니다. 어느 시간대의 이용자가 m명 미만이라면, 서버 증설이 필요하지 않습니다. 어느 시간대의 이용자가 n x m명 이상 (n + 1) x m명 미만이라면 최소 n대의 증설된 서버가 운영 중이어야 합니다. 한 번 증설한 서버는 k시간 동안 운영하고 그 이후에는 반납합니다. 예를 들어, k = 5 일 때 10시에 증설한 서버는 10 ~ 15시에만 운영됩니다.
하루 동안 모든 게임 이용자가 게임을 하기 위해 서버를 최소 몇 번 증설해야 하는지 알고 싶습니다. 같은 시간대에 서버를 x대 증설했다면 해당 시간대의 증설 횟수는 x회입니다.
다음은 m = 3, k = 5 일 때의 시간대별 증설된 서버의 수와 증설 횟수 예시입니다.

모든 게임 이용자를 감당하기 위해 최소 7번 서버를 증설해야 하며, 이보다 적은 수의 서버 증설로는 모든 게임 이용자를 감당할 수 없습니다.
0시에서 23시까지의 시간대별 게임 이용자의 수를 나타내는 1차원 정수 배열 players, 서버 한 대로 감당할 수 있는 최대 이용자의 수를 나타내는 정수 m, 서버 한 대가 운영 가능한 시간을 나타내는 정수 k가 주어집니다. 이때, 모든 게임 이용자를 감당하기 위한 최소 서버 증설 횟수를 return 하도록 solution을 완성해 주세요.
제한사항
- players의 길이 = 24
- 0 ≤ players의 원소 ≤ 1,000
- players[i]는 i시 ~ i+1시 사이의 게임 이용자의 수를 나타냅니다.
- 1 ≤ m ≤ 1,000
- 1 ≤ k ≤ 24
테스트 케이스 구성 안내
아래는 테스트 케이스 구성을 나타냅니다. 각 그룹 내의 테스트 케이스를 모두 통과하면 해당 그룹에 할당된 점수를 획득할 수 있습니다.

입출력 예 설명
입출력 예 #1
- 문제의 예시와 같습니다.
입출력 예 #2
- 총 11번 서버를 증설해야 합니다.
- 3 ~ 4시: 2번
- 5 ~ 6시: 2번
- 7 ~ 8시: 3번
- 15 ~ 16시: 1번
- 18 ~ 19시: 2번
- 20 ~ 21시: 1번
입출력 예 #3
- 총 12번 서버를 증설해야 합니다.
- 5 ~ 6시: 2번
- 9 ~ 10시: 1번
- 11 ~ 12시: 5번
- 13 ~ 14시: 2번
- 15 ~ 16시: 1번
- 23 ~ 24시: 1번
풀이 방법
- 별 다른 공식 없이 브루트포스를 이용하여 풀었다.
- n * m <= x < (n + 1) * m 을 만족하지 못할때, 필요한 추가 서버 갯수는 다음 공식을 따른다.

- 만약 m = 3이고 k = 5인 상태에서 서버가 한대 있고, 플레이어수가 13이라면
- 필요한 서버 갯수는 ⌊ (13 / 3) ⌋ - 1 = 4 - 1 = 3대이다.
- 또 서버를 담을 배열을 정해 종료시간을 배열에 담고, idx + 1 과 일치하는 시점이 오게되면, 서버를 삭제시켰다.
풀이 코드
function solution(players, m, k) {
let answer = 0;
//서버 증설용...
let server = [];
//플레이어 수를 반복하면서, 서버를 판단하기
players.forEach((player, idx) => {
//서버가 부족하다면 추가해주어야한다.
if(!checkServer(server.length, m, player)){
//필요한 서버갯수 구하기
let needServer = Math.floor(player / m) - server.length;
//서버 유지시간은 5시간
for(let i = 0; i < needServer; i++){
server.push(idx + k);
answer++;
}
}
//시간이 다 된 서버는 삭제
while(server.length !== 0 && server[0] === idx + 1){
server.shift();
}
})
return answer;
}
//시간대 이용자의 수가 적당한지 판단
function checkServer(n, m, k){
if(k >= (n * m) && k < (n + 1) * m){
return true;
}
return false;
}
결과

회고
- 2단계부터는 머리를 좀 써야하는구나
'알고리즘' 카테고리의 다른 글
| [프로그래머스] 지게차와 크레인 - JavaScript (1) | 2025.02.24 |
|---|---|
| [프로그래머스] 완전범죄 - JavaScript (1) | 2025.02.20 |
| [프로그래머스] 비밀 코드 해독 - JavaScript (1) | 2025.02.18 |
| [프로그래머스] 유연 근무제 - JavaScript (1) | 2025.02.17 |
| [백준] 이분 그래프 - Java (1) | 2025.02.14 |