코테

[코테] 프로그래머스 - 디펜스 게임

2h1824 2025. 3. 24. 23:48

1. 문제

  • 총 병사 수(n)와 라운드 프리패스 가능한 횟수(k), 라운드 별 적군 수(enemy) 제공
    병사와 적군은 1:1 비율로 방어 가능, 방어에 사용시 차감
  • 주어진 조건에서 최대로 방어 가능한 라운드 구하기
  • 남은 병사 수가 해당 라운드의 적군 수보다 적고 프리패스 횟수도 0이라면 게임 종료

2. 풀이

  • 완전탐색+백트래킹 고려
    ㅡ> Input의 크기를 생각했을 때, 시간복잡도를 맞추지 못할 확률이 높고, 더 나은 방법이 있을 것으로 추정
  • 가장 많은 수의 적이 오는 라운드를 k개의 프리패스로 병력 손실 없이 패스하는 것이 최대 라운드까지 가는 방법
  • k개의 최댓값 라운드를 추적할 수단이 필요
  • 우선순위 큐를 최소 힙 형태로 활용

3. 코드

#include <bits/stdc++.h>

using namespace std;

int solution(int n, int k, vector<int> enemy) {
    priority_queue<int, vector<int>, greater<int>> pq; // 최소 힙
    long long answer = 0; 
    
    for(int i = 0; i < enemy.size(); i++) {
        pq.push(enemy[i]);
        
        // 최소 힙을 이용해 가장 큰 값을 지닌 k개의 라운드 추적 -> 초과분 합산하여 처리
        if(pq.size() > k) {
            answer += pq.top();
            pq.pop();
        }
        
        // 현재 합계가 n을 초과하면 더 진행 불가
        if(answer > n) {
            return i;
        }
    }
    
    // 여기까지 왔으면 모든 웨이브를 버틴 것
    return enemy.size();
}
  • 우선 순위 큐를 최소 힙 형태로 활용
    ㅡ> top에 원소 중 가장 작은 값이 위치
    ㅡ> 조건을 달아 k개의 큰 값들을 큐에서 가지고 있도록 활용 가능
  • 큐에서 꺼내는 원소는 병력을 이용해 막은 라운드에 해당하므로 손실되는 병력 누적 합산
  • 손실된 병력의 누적값이 보유하고 있던 총 병력 수인 n보다 커지면 진행 불가로 현재 라운드 반환하며 종료
  • 입력된 모든 라운드 순회했다면 전체 라운드 수 반환하며 종료

참고자료

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

 

프로그래머스

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

programmers.co.kr