Q. 문제
당신은 온라인 게임을 운영하고 있습니다. 같은 시간대에 게임을 이용하는 사람이 m명 늘어날 때마다 서버 1대가 추가로 필요합니다. 어느 시간대의 이용자가 m명 미만이라면, 서버 증설이 필요하지 않습니다. 어느 시간대의 이용자가 n x m명 이상 (n + 1) x m명 미만이라면 최소 n대의 증설된 서버가 운영 중이어야 합니다. 한 번 증설한 서버는 k시간 동안 운영하고 그 이후에는 반납합니다. 예를 들어, k = 5 일 때 10시에 증설한 서버는 10 ~ 15시에만 운영됩니다.
하루 동안 모든 게임 이용자가 게임을 하기 위해 서버를 최소 몇 번 증설해야 하는지 알고 싶습니다. 같은 시간대에 서버를 x대 증설했다면 해당 시간대의 증설 횟수는 x회입니다.
다음은 m = 3, k = 5 일 때의 시간대별 증설된 서버의 수와 증설 횟수 예시입니다.
시각 | 게임 이용자의 수 | 증설된 서버의 수 | 증설 횟수 |
0 ~ 1 | 0 | 0 | 0 |
1 ~ 2 | 2 | 0 | 0 |
2 ~ 3 | 3 | 1 | 1 |
3 ~ 4 | 3 | 1 | 0 |
4 ~ 5 | 1 | 1 | 0 |
5 ~ 6 | 2 | 1 | 0 |
6 ~ 7 | 0 | 1 | 0 |
7 ~ 8 | 0 | 0 | 0 |
8 ~ 9 | 0 | 0 | 0 |
9 ~ 10 | 0 | 0 | 0 |
10 ~ 11 | 4 | 1 | 1 |
11 ~ 12 | 2 | 1 | 0 |
12 ~ 13 | 0 | 1 | 0 |
13 ~ 14 | 6 | 2 | 1 |
14 ~ 15 | 0 | 2 | 0 |
15 ~ 16 | 4 | 1 | 0 |
16 ~ 17 | 2 | 1 | 0 |
17 ~ 18 | 13 | 4 | 3 |
18 ~ 19 | 3 | 3 | 0 |
19 ~ 20 | 5 | 3 | 0 |
20 ~ 21 | 10 | 3 | 0 |
21 ~ 22 | 0 | 3 | 0 |
22 ~ 23 | 1 | 0 | 0 |
23 ~ 24 | 5 | 1 | 1 |
모든 게임 이용자를 감당하기 위해 최소 7번 서버를 증설해야 하며, 이보다 적은 수의 서버 증설로는 모든 게임 이용자를 감당할 수 없습니다.
0시에서 23시까지의 시간대별 게임 이용자의 수를 나타내는 1차원 정수 배열 players, 서버 한 대로 감당할 수 있는 최대 이용자의 수를 나타내는 정수 m, 서버 한 대가 운영 가능한 시간을 나타내는 정수 k가 주어집니다. 이때, 모든 게임 이용자를 감당하기 위한 최소 서버 증설 횟수를 return 하도록 solution을 완성해 주세요.
* 문제풀이흐름
1. 문제에서 제시된 표에 따른 배열을 생성하고 0으로 채움
=> 증설된 서버의 수 : server, 증설 횟수 : answer
2. 게임 이용자 수를 확인하면서 server가 몇개 필요한지 serverCount에 저장
3. 설치된 server의 개수가 serverCount보다 작다면 증설 횟수와 서버의 수를 갱신
=> 증설 횟수는 필요한 server - 설치된 server : serverCount - server[i]
=> 서버의 수는 현재 시점(i)에서 k만큼(혹은 배열의 끝까지) 증설 횟수를 더해줌
4. answer 배열의 총합 return
A. 풀이
function solution(players, m, k) {
//증설 횟수 배열
var answer = new Array(players.length).fill(0);
//증설된 서버의 수 배열
let server = new Array(players.length).fill(0);
for(let i = 0; i < players.length; i++) {
let serverCount = Math.floor(players[i] / m)
//서버 증설 기준 : 필요한 server의 개수보다 설치된 server 개수가 작다면 추가
if(serverCount > server[i]) {
//증설 횟수 갱신
answer[i] = serverCount - server[i]
//증설된 서버의 수 갱신
for(let j = i; j < Math.min(i+k, server.length); j++) {
server[j] = server[j] + answer[i]
}
}
}
//answer array의 총합
return answer.reduce((acc, cur) => acc + cur, 0);
}
'Coding Test' 카테고리의 다른 글
[JavaScript] PCCP 기출문제 2번 - 퍼즐 게임 챌린지 (0) | 2025.04.02 |
---|---|
[JavaScript] 2025 프로그래머스 코드챌린지 2차 예선 - 완전범죄 (0) | 2025.03.31 |
[JavaScript] 2023 KAKAO BLIND RECRUITMENT - 택배 배달과 수거하기 (0) | 2025.03.23 |
[JavaScript] 2023 KAKAO BLIND RECRUITMENT - 개인정보 수집 유효기간 (0) | 2025.03.23 |
[JavaScript] 2023 KAKAO BLIND RECRUITMENT - 이모티콘 할인행사 (0) | 2025.03.23 |