YataNox
[Java] Lv.2 디펜스 게임 본문
문제
문제 풀이
일단 내림차순으로 저장하는 우선순위 큐를 하나 생성하고
적군 배열 수만큼 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;
}
}
'코딩 테스트 > PROGRAMMERS' 카테고리의 다른 글
[Java] Lv.2 숫자 카드 나누기 (0) | 2024.06.18 |
---|---|
[Java] Lv.2 귤 고르기 (0) | 2024.06.14 |
[Java] Lv.2 테이블 해시 함수 (2) | 2024.06.13 |
[Java] Lv.2 유사 칸토어 비트열 (0) | 2024.06.13 |
[Java] Lv.2 마법의 엘리베이터 (2) | 2024.06.11 |