문제
- n에 현재 나의 병력의 수, enemy 배열에 각 라운드별 적군의 수가 주어진다.
- 적군의 수만큼 나의 병력을 소모하여 적을 막을 수 있다.
- 한 라운드를 병력 소모없이 넘어갈 수 있는 무적권 k가 주어진다.
- 이때, 무적권을 적절히 사용하여 막을 수 있는 최대 라운드를 구하여라
풀이 과정
1. 무적권을 사용하지 않고 가능한 라운드까지 진행
2. 각 라운드별 적군의 수를 저장 -> Heap 자료구조 / Kotlin에서는 PriorityQueue 사용
3. 나의 병력으로 넘어갈 수 없을 때, 현재 적군의 병력과 이전 적군 중 가장 많은 적군을 비교
4. 더 큰 적군에 무적권을 사용
4-1. 현재 적군이 더 많다면 라운드만 증가
4-2 이전 적군이 더 많다면 현재 n에 이전 적군을 더하고 배열에서 삭제, 현재 적군을 배열에 저장
코드
import java.util.*
class Solution {
fun solution(n: Int, k: Int, enemy: IntArray): Int {
var answer: Int = 0
var N = n
var K = k
// 라운드 별 적군 수 저장 (내림차순)
val temp = PriorityQueue<Int>(reverseOrder()) // reverseOrder()로 내림차순 설정
for(i in enemy){
// 적이 더 많은데 무적권도 없다면 종료
if(K == 0 && N - i < 0) break
answer++
// 아군이 더 많다면
if(N - i >= 0){
temp.add(i)
N -= i
}
// 적군이 더 많다면 무적권 사용
else{
K--
// 현재 적군의 수(i)보다 temp에 있는 가장 큰 수가 더 크다면
// temp의 가장 큰 수에 무적권 사용 후 i 저장
if(temp.isNotEmpty() && i < temp.peek()) {
N += temp.poll() - i
temp.add(i)
}
// 현재 적군의 수(i)가 더 많다면 i에 무적권 사용
}
}
return answer
}
}
'코딩 테스트 > Heap' 카테고리의 다른 글
[프로그래머스] 디스크 컨트롤러 with Kotlin (0) | 2024.06.18 |
---|