본문 바로가기
알고리즘/프로그래머스 LV2

프로그래머스 LV2 ( 디펜스 게임 )

by 꽃요미 2025. 1. 30.

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

 

프로그래머스

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

programmers.co.kr

 

* 남은 병사수와 무적권의 횟수를 잘 사용하여 최대로 막을 수 있는 횟수를 반환하면 되는 문제.

* 처음에는 병사수를 최대한 사용하고 무적권을 사용하면 되는줄 알았다.

* 그렇게 구현하기 쉽지않았고 결국 문제 풀이를 보니까 pq를 사용한 풀이였다.

* enemy 배열을 순차적으로 한개씩 가져와서 문제를 풀어야한다. ( 적은 인덱스 0번부터 접근하니까 )

* enemy 배열에 접근을 순차적으로 해서 무적권 갯수만큼은 pq에 저장하고 continue 한다.

* 무적권 갯수 이후에 enemy 배열에 접근할때 pq에 값을 빼서 병사수에서 차감한다.

* 만얀 차감했을때 음수라면 병사수를 모두 소진한 것이니 끝.

* 순서대로 처리해야한다는 강박에 무조건 순차적으로 처리해야 한다고 생각해서 못 풀었다.

* 라운드 내에서는 순서가 변경되도 상관없어서 pq로 처리하면 된다.

* 아래는 구현 코드이다.

 

import java.io.*;
import java.util.*;

class Solution {
    int answer = 0, remainSoldiers = 0, useShields = 0;
    public int solution(int n, int k, int[] enemy) {
        PriorityQueue<Integer> pq = new PriorityQueue<>();
        for(int e : enemy) {
            pq.add(e);
            if(pq.size() <= k) {
                answer++;
                continue;
            }
            int node = pq.poll();
            n -= node;
            if(n < 0) break;
            answer++;
        }
        return answer;
    }
}