문제
https://school.programmers.co.kr/learn/courses/30/lessons/142085
생각한 것
자료 구조를 어떻게 저장할까? ==> PriorityQueue를 활용하여 지난 라운드의 enemy 숫자 저장
어떤 규칙으로 무적권을 쓸까? ==> 지난 라운드 enemy 숫자 중 가장 큰 숫자를 더해주면 가장 최선의 라운드 진행이 가능함
라운드 카운트는 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 값을 리턴해주면 끝.