본문 바로가기

코딩 테스트/Heap

[프로그래머스] 디펜스 게임 Lv.2 with Kotlin

문제

  • 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