양갱의 개발 블로그

[프로그래머스] [2025 프로그래머스 코드챌린지 2차 예선] 서버 증설 횟수(Java) 본문

코딩테스트/프로그래머스

[프로그래머스] [2025 프로그래머스 코드챌린지 2차 예선] 서버 증설 횟수(Java)

연지양갱 2025. 3. 27. 15:24
728x90

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

 

프로그래머스

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

programmers.co.kr

 

풀이

1. 증설되어야 하는 서버의 개수를 주기적으로 확인해줘야합니다.

2. 반납 시간(k) 주의 해줘야합니다.

 

사용자 수 가 m보다 작으면 증설할 필요가 없지만, m보다 크면 몇개가 필요한지 계산해야합니다.

계산 과정을 사용자수 / m으로 하구 

Queue에는 반납해야하는 시간을 add나 offer을 해줍니다.

그리고 for문을 돌릴때마다 queue에 들어 있는 서버의 반납시간을 확인하고 넘어가줘야합니다.

 

 

 

초기 코드(오류 많음 - Queue사용 X)

class Solution {
    public int solution(int[] players, int m, int k) {
        int answer = 0;
        
        // n이 서버 개수? 초기에는 1
        
        // n * m ~ (n+1) * m
        // m : 게임 이용자 수
        // k : 증설 시간 5시 ~ 10시까지 증설되고 반납
        // players는 24시간
        int server=0; // 현재 서버
        int expansionTime = 0; // 증설되고 종료되는 시간
        int expansionServer = 0; // 증설된 서버 개수
        for (int i=0; i<players.length; i++){
            if(expansionTime != 0 && expansionTime + k <= i) {
                expansionTime = 0; // 증설 시간이 종료 되면
                server -= expansionServer;
            }
            System.out.println(i+"시 게임 이용자 수= "+players[i]+" 서버 수= " + server + " answer= "+answer);
            
            if (players[i] < server*m) continue;
            if (!(players[i] >= server * m && players[i] < (server + 1) * m)) {
                expansionTime = i; // 증설 시작 시간
                server = players[i]/m; // 현재 서버
                expansionServer = players[i]/m; // 증설된 서버의 수
                answer += players[i]/m ; // 증설 횟수
                System.out.println("최종 => 게임 증설 횟수= " + players[i]/m +" 이용자 수= "+players[i]+" 서버 수= " + server + " answer= "+answer);
            }
            
            
        }
        
        return answer;
    }
}

 

 

 

최종 코드

import java.util.LinkedList;
import java.util.Queue;

class Solution {
    public int solution(int[] players, int m, int k) {
        int answer = 0;
        
        Queue<Integer> server = new LinkedList<Integer>();
        
        for (int i=0; i<players.length; i++){
            int expansionServer = players[i] / m; // 사용자 수 대비 필요한 서버 수
            
            // 반납되어야 하는 시간 확인 후 빼주기
            while(!server.isEmpty() && server.peek() <= i){ // 서버의 반납 시간을 확인해줘야합니다.
                server.poll();
            }
            
            
            if(expansionServer > server.size()) {
                int count = expansionServer-server.size();
                for (int n=0; n< count; n++){
                    server.add(i+k); // 반납해야하는 시간을 queue에 추가
                    answer ++; // 증가한 개수만큼 answer ++
                }
            }
            System.out.println(i+"시간 : queue => "+server + " 서버 개수= "+server.size() +" expansionServer= "+ expansionServer);
        }
        
        
        return answer;
    }
}
728x90