우당탕탕 개발일지

[프로그래머스] 서버 증설 횟수 (Lv.2, Java) 본문

코테/프로그래머스

[프로그래머스] 서버 증설 횟수 (Lv.2, Java)

ujin302 2025. 3. 20. 16:48
반응형

문제

같은 시간대에 게임을 이용하는 사람이 m명 늘어날 때마다 서버 1대가 추가로 필요

k = 5 일 때 10시에 증설한 서버는 10 ~ 15시에만 운영됩니다.

 

입출력 예

 

풀이

나는 큐에 삭제할 시간과 개수를 저장해서 관리했다.

answer: 결과값

serverCount: 현재 서버 개수

timeQueue: {삭제한 시간, 개수}

 

1. 서버 증설해야 하는 경우

조건1. 기준 인원보다 접속인원이 이상일 경

조건2. 필요한 서버 수보다 현재 서버 수가 적을 경우

 

해당 조건에 충족하면 증설 회수와 서버 개수 설정한다.

그리고 나중에 서버가 삭제 시 필요한 정보를 Queue에 저장한다.

 

2. 서버 삭제해야 하는 경우

조건1. 삭제 정보가 있는 경우

조건2. 삭제 시간이 되었을 경우

 

조건을 충족하면 서버 개수를 재설정 후, 해당 삭제 정보를 큐에서 제거한다.

* 항상 먼저 들어온 원소가 가장 빠른 시간에 삭제됨으로 우선순위 큐를 사용하지 않았다. 확장성 생각하면 우선순위가 더 좋을지두?

 

 

코드

public int solution(int[] players, int m, int k) {
        int answer = 0;
        int serverCount = 0; // 서버 개수
        Queue<int[]> timeQueue = new LinkedList<int[]>(); // 삭제할 시간, 삭제할 개수
        
        for(int i=0; i< players.length; i++) {
            System.out.println("i = " + i + " & server count = " + serverCount);
            // 서버 삭제 개수 설정
            if(timeQueue.size() > 0 && timeQueue.peek()[0] == i) {
                serverCount -= timeQueue.peek()[1];
                timeQueue.poll();
            }
            
            // 서버 증설해야 하는 경우
            int c = players[i] / m; // 필요한 서버 수
            if(players[i] >= m && c > serverCount) {
                    answer += (c-=serverCount);
                    serverCount += c;
                    System.out.println(">> c = " + c + " & i+k = " + (i+k));
                    timeQueue.add(new int[]{i + k, c});
            }
        }
        return answer;
    }

 

 

프로그래머스 문제

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

 

프로그래머스

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

programmers.co.kr

 

반응형