[프로그래머스 C++] 디펜스 게임

 

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

 

프로그래머스

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

programmers.co.kr


 

해결전략

 

우선순위큐 Priority Queue


 

처음 시도한 코드 - DFS 시간초과

 

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int answer;

void DFS(int n, int k, vector<int> e, int cnt)
{
    if (cnt == e.size() || k < 0 || k == 0 && n - e[cnt] < 0) {
        answer = max(answer, cnt);
        return;
    }

    if (n >= e[cnt]) 
        DFS(n - e[cnt], k, e, cnt + 1);
    if (k > 0) 
        DFS(n, k - 1, e, cnt + 1);
}

int solution(int n, int k, vector<int> e) {
    
    DFS(n, k, e, 0);

    return answer;
}

 


 

정답 코드

 

#include <string>
#include <vector>
#include <queue>
using namespace std;

int solution(int n, int k, vector<int> e)
{
    int answer = e.size(); // 모든 라운드를 통과하는 경우를 초기값으로 설정
    int sum = 0;

    priority_queue<int, vector<int>, greater<int>> pQ; // 오름차순
    
    for (int i = 0; i < e.size(); i++)
    {
        pQ.push(e[i]);

        if (pQ.size() > k) // 무적권보다 개수보다 크게 쌓이게되면
        {
            sum += pQ.top(); // 가장 작은값(=무적권을 사용하지 않고 무찌른 적 병사 수)을 더함 
            pQ.pop();       // 해당 경우는 무적권을 안 쓴 경우이니 빼준다
        }

        if (sum > n) { // 해치운 적의 수의 합 > 처음에 주어진 병사 수
            answer = i;
            break;
        }
    }

    return answer;
}

int main() {
    vector<int> testcase1 = { 4, 2, 4, 5, 3, 3, 1 };
    vector<int> testcase2 = { 3, 3, 3, 3 };
    vector<int> testcase3 = { 99, 1, 99 };
    vector<int> testcase4 = { 2, 1, 5, 1 };
    vector<int> testcase5 = { 2, 1, 99, 99 };
    vector<int> testcase6 = { 2, 2, 2, 2, 3, 3, 1 };
    vector<int> testcase7 = { 2, 2, 2, 2, 2, 10 };
    vector<int> testcase8 = { 2, 2, 2, 2, 10 };
    vector<int> testcase9 = { 3, 4 };

    cout << "Result = " << solution(7, 3, testcase1) << "\n"; // 5
    cout << "Result = " << solution(2, 4, testcase2) << "\n"; // 4
    cout << "Result = " << solution(5, 2, testcase3) << "\n"; // 3
    cout << "Result = " << solution(7, 1, testcase4) << "\n"; // 4
    cout << "Result = " << solution(7, 2, testcase5) << "\n"; // 4
    cout << "Result = " << solution(1, 6, testcase6) << "\n"; // 7
    cout << "Result = " << solution(10, 1, testcase7) << "\n"; // 6
    cout << "Result = " << solution(10, 1, testcase8) << "\n"; // 5
    cout << "Result = " << solution(3, 1, testcase9) << "\n"; // 2

    return 0;
}