Algorithm/Programmers

서버 증설 횟수

Red_Horse 2025. 8. 23. 13:37

출처 : 프로그래머스

난이도 : Level 2

 

문제 설명

당신은 온라인 게임을 운영하고 있습니다. 같은 시간대에 게임을 이용하는 사람이 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을 완성해 주세요.

 

제한사항

  • players의 길이 = 24
  • 1 ≤ m ≤ 1,000
  • 1 ≤ k ≤ 24

 

테스트 케이스 구성 안내

아래는 테스트 케이스 구성을 나타냅니다. 각 그룹 내의 테스트 케이스를 모두 통과하면 해당 그룹에 할당된 점수를 획득할 수 있습니다.

그룹 총점 추가 제한 사항
#1 5% m = 1, k = 1
#2 7% k = 1
#3 88% 추가 제한 사항 없음

입출력 예

players m k result
[0, 2, 3, 3, 1, 2, 0, 0, 0, 0, 4, 2, 0, 6, 0, 4, 2, 13, 3, 5, 10, 0, 1, 5] 3 5 7
[0, 0, 0, 10, 0, 12, 0, 15, 0, 1, 0, 1, 0, 0, 0, 5, 0, 0, 11, 0, 8, 0, 0, 0] 5 1 11
[0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 5, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1] 1 1 12

 

입출력 예 설명

입출력 예 #1

  • 문제의 예시와 같습니다.

입출력 예 #2

  • 총 11번 서버를 증설해야 합니다.

입출력 예 #3

  • 총 12번 서버를 증설해야 합니다.

 

----------------------------------------------------------------------------------------------------------------------------

 

문제 해독

 

온라인 게임 진행중 서버의 개수가 부족해지면 추가 서버를 증설하여 유저가 플레이할 수 있게 지원합니다.

 

문제접근

매시각마다 만료되는 서버, 플레이어 수 대비 현재 서버의 수, 서버가 부족할시 (현재 시간 + k)에 종료되는 서버를 현재 시간에 필요한 만큼 증설 합니다.(단, 서버 대비 사용자가 적을 경우 추가적인 연산은 없습니다.)

 

필요 변수 리스트

 - 서버 생성 횟수

 - 현재 서버의 수

 - 큐(현재 서버의 만료시간을 가지고 있는 큐)

 

필요 알고리즘

 - 시뮬레이션

 - 그리디

 

using System;
using System.Collections.Generic;

public class Solution {
    public int solution(int[] players, int m, int k) {
        int createServerCount = 0;
        int liveServer = 0;
        
        Queue<int> serverEndTimes = new Queue<int>();
        
        for (int i = 0; i < players.Length; i++) {
            while (serverEndTimes.Count > 0 && serverEndTimes.Peek() == i) {
                serverEndTimes.Dequeue();
                liveServer--;
            }
            
            int needServer = players[i] / m;
            if (needServer > liveServer) {
                int add = needServer - liveServer;
                createServerCount += add;
                liveServer += add;
                
                for (int j = 0; j < add; j++) {
                    serverEndTimes.Enqueue(i + k);
                }
            }
        }
        
        return createServerCount;
    }
}

'Algorithm > Programmers' 카테고리의 다른 글

배달  (0) 2025.08.24
단어 변환  (2) 2025.08.23
여행 경로  (0) 2025.08.23
퍼즐 조각 채우기  (1) 2025.08.23
디펜스 게임  (0) 2025.08.21