Algorithm

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

합주기 2025. 2. 21. 16:37

목차

1. 문제 설명

2. 문제 풀이

3. 전체 코드

4. 배운 점


1. 문제 설명

입력

players : 매시각의 플레이어 수/ m : 서버를 증설하기 위한 사람 수 조건/ k : 서버 가동 시간

매시각 플레이어들의 수를 통해 증설해야하는 서버 수를 계산해야한다. 이 때, m명이 늘어날 때마다 서버 1대가 추가로 필요하다.

예를 들어, m = 3일 때, 3명일 때 서버를 1대 늘려야하고, 6명일 때 서버를 2대 늘려야한다.

이 서버의 가동시간은 k이다. 따라서 가동시간 이후에는 서버를 종료시켜 계산해야한다.


2. 문제 풀이

 

1️⃣ 변수 초기화

k 시간 이후 서버를 종료시키기 위해, 각 서버의 종료시간을 저장할 큐가 필요하다 생각했다.

2️⃣ 종료 시간을 넘긴 서버 제거하기

몇개를 더 가동할지 계산하기 전, 종료시간이 지난 서버들을 제거해야한다. 따라서 큐에 있는 종료시간들 중 현재시각과 같은 서버들을 popleft 해주었다.

3️⃣ 필요한 서버 계산하기

플레이어수 // m을 하여 현재 필요한 서버 수를 계산할 수 있다.

만약 필요한 서버 수 > 현재 가동되고 있는 서버 수보다 클 경우, 그 차이만큼 서버를 추가해야한다.

서버를 추가하기 위해 (i + k) : (현재시각 + 가동시간), 즉 종료시각을 구하여 큐에 추가한다.


3. 전체 코드

function solution(players, m, k) { // 플레이어, m명, k시간
    var answer = 0;
    
    var server = []; // 가동중인 서버의 중단 시간들을 저장할 큐
    
    players.forEach((player, i) => { 
        // 현재 실행중인 서버들 중 가동 시간을 넘긴 서버 제거
        while (server.length && i >= server[0]) {
            server.shift();
        }
        
        var needed = Math.floor(player / m); // 필요한 서버 수
        
        if (needed > server.length) { // 필요한 서버가 현재 실행중인 서버보다 많다면
            var count = needed - server.length;
     
            while (count--) {
                server.push(i + k);
                answer++;
            }
         
        } 
    });
    
    return answer;
}

4. 느낀 점

서버 종료시간을 저장할 자료구조 '큐'를 생각해내는 데, 10분

큐에서 popleft를 구현하기 위해 shift()를 쓸 지 front를 쓸 지 고민하고, 관련 에러 수정하는 데 30분이 걸렸다.

총 1시간 좀 안되게 풀었는데, 쉬운 문제였는데.... 구현 문제를 많이 풀어야겠다는 생각을 했다.