본문 바로가기

알고리즘/프로그래머스

[프로그래머스][JAVA] Lv.2 / 서버 증설 횟수

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

 

프로그래머스

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

programmers.co.kr

비교적 최근 문제라서 그런지 다른 사람의 풀이를 보기 쉽지 않아 직접 남겨보는 글이다.
- 추후 코드 수정이 필요할 수 있습니다 

 

- 코드 풀이 과정 -

  1. currentTime으로 현재 시각을 나타내며 24시간까지 루프를 돌리는 방식
  2. 서버는 일정 시간의 증설 시간 이후로 삭제된다. (Queue로 구현해 만료되면 Poll로 없애주는 방식)
  3. 현재 수용할 수 있는 사용자(availableCapacity)와 현 시간의 사용자(player)를 비교하여 서버 증설 여부를 결정한다.
  4. 실제로 필요한 값은 서버 증설이 몇대나 이루어졌는지 이므로 서버 증설할 때 answer에 추가해준다.
public int solution(int[] players, int m, int k) {
        int answer = 0;
        int currentTime = 0;
        Queue<Integer> serverExpire = new LinkedList<>();

        while (currentTime < players.length) {
            while (!serverExpire.isEmpty() && serverExpire.peek() < currentTime) {
                serverExpire.poll();
            }
            int player = players[currentTime];
            int currentServerCnt = serverExpire.size();
            int availableCapacity = (currentServerCnt + 1) * m;
            if (player >= availableCapacity) {
                int addServerCnt = ((player - availableCapacity) / m) + 1;
                answer += addServerCnt;
                for (int i = 0; i < addServerCnt; i++) {
                    serverExpire.offer(currentTime + k - 1);
                }
            }

            currentTime++;
        }

        return answer;
    }