프로그래머스_디펜스게임

권권·2023년 3월 27일
0

Java 예제🛒

목록 보기
12/14
post-thumbnail

문제
https://school.programmers.co.kr/learn/courses/30/lessons/142085

생각한 것

  1. 자료 구조를 어떻게 저장할까? ==> PriorityQueue를 활용하여 지난 라운드의 enemy 숫자 저장

  2. 어떤 규칙으로 무적권을 쓸까? ==> 지난 라운드 enemy 숫자 중 가장 큰 숫자를 더해주면 가장 최선의 라운드 진행이 가능함

  3. 라운드 카운트는 for 문에서 몇번 돌아갔는지를 활용한다.

코드

import java.util.PriorityQueue;
import java.util.Collections;
class Solution {
    public int solution(int n, int k, int[] enemy) {
        int answer = enemy.length;
        PriorityQueue<Integer> arr = new PriorityQueue<>(Collections.reverseOrder());
        
        // 아래 주석 코드는 int answer = enemy.length; 를 하면서 필요없어진 코드이다. 
        // if(k >= enemy.length){
        //     return enemy.length;
        // }

        for (int i = 0; i < enemy.length; i++) {
            n -= enemy[i];
            arr.add(enemy[i]);

            if (n < 0) {
                if (k > 0 && !arr.isEmpty()) {
                    n += arr.poll();
                    k--;
                } else {
                    answer = i;
                    break;
                }
            }
        }
        return answer;
    }
}

이 코드는 하나하나 짚어가며 보려고 한다.

우선 answer를 enemy.length로 한 것은 초기값을 모두 클리어한 것으로 둠으로써 추후 서술할 코드들에 해당되지 않을 경우 전체 클리어를 리턴하기 위함이다.

그리고 priorityQueue를 만들어 주었고, 정렬 규칙은 내림차순, 즉 큰 수가 먼저 빠져나올 수 있게 설정하였다.

그리고 enemy 배열에서 하나씩 꺼내서 n 에 그것들을 빼주는 작업들을 하였다.
그 작업 후 priorityQueue에 해당 배열 요소를 저장해주었다.

계속 진행하다보면 n 이 0보다 작게 될 때가 오는데, 그 때 무적권을 사용하는 규칙이 실행된다.

n < 0 고 k (무적권의 갯수) 가 0 보다 크면서 priorityQueue가 비어있지 않을 때, n에 priorityQueue의 최고값을 더해줌으로서 k-- 를 해주고 다음 라운드로 넘어갈 수 있게 된다.

유의해야 할 것은 인덱스가 남은 값보다 크다고 해서 바로 멈추는 것이 아니라, 그 다음 인덱스까지는 보고 멈출지 결정하게 된다는 것이다.

헷갈려서 위의 코드를 실행해보았다.

그리고 for의 i 값을 리턴해주면 끝.

profile
안녕하세요

0개의 댓글