알고리즘

[프로그래머스] 서버 증설 횟수

moongi 2025. 5. 24. 18:43
728x90
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/389479

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

 

문제유형

  • 구현

문제 난이도

  • Lev2

문제분석

- 온라인 게임을 운영중인데, 시간마다 게임 이용자수, 서버 한 대당 가용 가능한 인원, 서버 한 대당 운영 시간이 주어진다.
- 기본적으로 서버는 한 대가 실행 중이고, 이용자 수가 많아져 서버가 더 필요한 경우, 서버를 증설하고, 증설한 횟수를 counting해서 결과값을 출력하는 문제이다.
- 문제에서 특별히 어려운 점은 없고, 주어진 문제 내용대로 구현을 진행하면 된다.

 

 

우선, 난 서버의 운영 가능시간을 확인하기 위해 List 배열을 활용해서 TTL을 설정해주었고, 우리는 0시부터 23시까지 Players들의 이용인원을 순회하므로 해당 시간대에 TTL이 일치한다면 List 배열에서 제거해주는 방식을 통해 현재 가용 가능한 서버의 수를 설정해주었다.

 while (!ttl.isEmpty() && ttl.get(0) == i) {
                // 서버 운영 가능시간 확인
                ttl.remove(0);
                server--;
            }

 

전체 코드

import java.util.*;
import java.io.*;

/**
* m: 서버 한대당 가용 가능한 인원
* k: 서버 한대당 유지 가능한 시간
*/

class Solution {
    public int solution(int[] players, int m, int k) {
        int result = 0;
        int server = 0; // 기본적으로 한대만 돌아가고 있음
        List<Integer> ttl = new ArrayList<>();
        
        for(int i = 0; i < players.length; i++) {
            
            while (!ttl.isEmpty() && ttl.get(0) == i) {
                // 서버 운영 가능시간 확인
                ttl.remove(0);
                server--;
            }
            
            if (players[i] >= (server + 1) * m) {
                // 서버가 더 필요한 경우
                int cnt = players[i] / m - server;
                // 증설 횟수
                result += cnt;
                
                for(int j = 0; j < cnt; j++) {
                    server++;
                    ttl.add(i + k);
                }
            }            
        }
        
        return result;
    }
}
728x90
반응형