알고리즘/Programmers

[Programmers/Java] 서버 증설 횟수

댕주 2025. 3. 24. 23:58
레벨2 > 2025년 프로그래머스 코드챌린지 2차 예선 > 서버 증설 횟수
사용 언어 : Java

 

문제 요약

  1. 이용자가 m명 늘어날 때마다 서버 1대가 추가로 필요
  2. 이용자가 m명 미만이면 서버가 필요하지 않음
  3. 이용자가 n×m명 이상 (n+1)×m명 미만이면 n대의 서버가 필요
  4. 서버는 증설한 후 k시간 동안만 운영
  5. 모든 게임 이용자를 감당하기 위한 최소 서버 증설 횟수를 찾아야 함
  • 변수
    players : 0시에서 23시까지의 시간대별 게임 이용자의 수를 나타내는 1차원 정수 배열
    m : 서버 한 대로 감당할 수 있는 최대 이용자의 수
    k : 서버 한 대가 운영 가능한 시간을 나타내는 정수

제한 사항

  • players 길이 : 24
  • 0 <= players 각 원소 <= 1000
  • players[i] : i 시 ~ (i + 1) 시 사이의 이용자 수
  • 1 <= m <= 1000
  • 1 <= k <= 24

문제 접근 방향

  1. 각 시간대별로 필요한 서버 수 계산
  2. 0시부터 23시까지 순차적으로 처리
    현대 시간에 운영 중인 서버 계산
    필요한 서버 수에서 이미 운영 중인 서버 수를 뺀 만큼 추가로 서버 증설
    증설 횟수 누적

문제 풀이

더보기
public int solution(int[] players, int m, int k) {
    int n = players.length; // 24시간
    int[] serversNeeded = new int[n]; // 각 시간대별 필요한 서버 수
    
    // 각 시간대별 필요한 서버 수 계산
    for (int i = 0; i < n; i++) {
        if (players[i] < m) {
            serversNeeded[i] = 0;  // m명 미만이면 서버 불필요
        } else {
            serversNeeded[i] = (players[i] / m);  // n×m명 이상 (n+1)×m명 미만이면 n대 필요
        }
    }
    
    int totalExpansions = 0;
    int[] activeServers = new int[n]; // 각 시간대별 증설한 서버 수
    
    // 각 시간대별로 처리
    for (int time = 0; time < n; time++) {
        // 필요한 서버 수
        int need = serversNeeded[time];
        
        // 이미 운영 중인 서버 수 (time-k+1부터 time-1까지 증설한 서버들)
        int running = 0;
        for (int t = Math.max(0, time - k + 1); t < time; t++) {
            running += activeServers[t];
        }
        
        // 추가로 필요한 서버 수
        int additional = Math.max(0, need - running);
        
        // 추가 서버 증설
        if (additional > 0) {
            activeServers[time] = additional;
            totalExpansions += additional;
        } else {
            activeServers[time] = 0;
        }
    }
    
    return totalExpansions;
}

 

풀이 설명

더보기

 

  1. 필요한 서버 수 계산:
    • players[i] < m인 경우: 서버가 필요 없음 (0대)
    • 그 외 경우: players[i] / m대의 서버 필요 (정수 나눗셈)
  2. 각 시간대별 서버 운영 및 증설:
    • activeServers 배열은 각 시간대에 증설한 서버 수를 저장
    • 현재 시간 time에 운영 중인 서버는 time-k+1부터 time-1까지 증설한 서버들
    • 필요한 서버 수 need에서 이미 운영 중인 서버 수 running을 뺀 값이 추가로 필요한 서버 수 additional
    • 추가 서버가 필요하면 증설하고 증설 횟수에 누적