본문 바로가기

코딩 테스트/PROGRAMMERS

[Java] Lv.2 디펜스 게임

문제

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

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 풀이

일단 내림차순으로 저장하는 우선순위 큐를 하나 생성하고 

적군 배열 수만큼 for문을 돌려 큐에 각 배열의 적군을 기록하면서 n을 차감한다.

이때

1.병사가 다죽었는데 무적권이 남아있는 경우,

2.병사도 무적권도 없는 경우

3.이외의 상황

으로 나누어 처리한다.

 

1는 무적권 수만큼 우선순위 큐에서 적군 수를 뽑고 병사 수 n을  나오는 적군 수만큼 다시 증가 시킨다.

이때 무적권이 다 소모됬거나 병사가 0명보다 많아졌을 경우 종료한다.

2는 그대로 종료한다.

3는 적군을 잘 막은 상황으로 정답 수를 + 1 한다.

자바 코드

import java.util.PriorityQueue;
import java.util.Collections;

class Solution {
    public int solution(int n, int k, int[] enemy) {
        int answer = 0;
        // 내림차순으로 정렬
        PriorityQueue<Integer> q = new PriorityQueue<>(Collections.reverseOrder());
        
        for(int i = 0; i < enemy.length; i++){
            // 막은 적군 수를 기록
            // 적군 수가 많은 라운드 우선 출력
            q.add(enemy[i]);
            // 병사 수 차감
            n -= enemy[i];
            
            // 병사가 다 죽었고 무적권이 남아있을 경우
            if(n < 0 && k > 0){
                for(int j = k; j > 0; j--){
                    // 적이 안남았으면 종료
                    if(q.isEmpty())
                        break;
                    
                    // 가장 많은 적군이 있던 라운드를 무적권 사용으로 막기
                    // 생존 라운드 + 1
                    // 무적권 - 1
                    n += q.poll();
                    answer += 1;                    
                    k--;
                    
                    // 무적권이 다 소모됬거나 병사가 0명이 아닐 경우 종료
                    if(k == 0 || n >= 0)
                        break;
                }
            }
            // 무적권도 없고 병사도 다죽었을 경우 종료
            else if(n < 0 && k <= 0 )
                break;
            // 이외에는 생존한 것이므로 생존 라운드 + 1
            else{
                answer += 1;
            }
        }
        
        return answer;
    }
}