코딩테스트/BAEKJOON

백준: 15708. 미네크래프트 (C++)

Sfer7 2025. 2. 26. 20:17
1. 문제 정보

 

2. 문제 풀이

 

이번 문제도 역시 쉽진 않았어요

처음에 풀이가 생각이 나지 않아 아래 쪽의 알고리즘 분류를 확인하고 감을 잡아 풀었습니다 🥲

우선순위 큐를 활용한 문제였어요

 

 

T = 20, P = 1이라는 조건으로 위의 예시를 볼게요
한 칸 한 칸 옆으로 이동해주며 사용 가능한 총 시간을 계산합니다

위의 예시의 경우 p가 1이므로 한 칸 이동할 때 마다 1씩 감소하게 되겠지요 😀

최대 힙을 이용해 우선순위 큐를 구성하고 미네랄의 위치에서 사용 가능 시간미네랄을 비교해 추가가 가능하면 큐에 넣어줍니다

큐의 TOP과 미네랄을 비교했을 때, TOP이 현재 미네랄보다 크다면 제거해줍니다


차례대로 한 번 살펴볼게요 !

 

첫 번째의 경우 사용 가능 시간이 20이고, 이때 시간 소모가 9인 미네랄을 충분히 담을 수 있으므로 큐에 넣어줍니다

 

 

두 번째도 동일한 과정이에요

P = 1이므로 두 번째에 도달했을 때는 사용 가능 시간이 19입니다
그리고 미네랄을 담을 만큼 충분히 시간이 남아 8을 추가로 넣어줍니다 👀

 

 

세 번째 경우인데요, 이때는 추가로 넣으려고 보니 이전 큐의 17에서 8을 더해야해요

그런데 사용 가능 시간인 18을 넘어버리게 됩니다

일단 큐에 7을 넣어주고, 가용 범위인 18이 될 때 까지 TOP에서 하나씩 제거해줍니다

이번 경우는 9만 제거하면 합이 24에서 15가 되므로 큐를 유지할 수 있겠네요 🥰

이런 방식으로 풀게 되면 비교적 쉽게 풀리는 문제였어요 !
아이디어를 떠올리기만 하면 크게 어렵지 않은 문제였습니다 🤗

 

 
#include <iostream>
#include <vector>
#include <queue>

using namespace std;

int n, t, p, x;
int weight = 0;
int ans = 0;
int max_ans = 0;
vector<int> stones;
priority_queue<int> pq;

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    cin >> n >> t >> p;

    for (int i = 0; i < n; i++) {
        cin >> x;

        stones.push_back(x);
    }

    for (int i = 0; i < n; i++) {
        if (t < i * p) break;

        weight += stones[i];
        pq.push(stones[i]);
        ans++;

        while (!pq.empty() && weight + i * p > t) {
            weight -= pq.top();
            pq.pop();
            ans--;
        }

        max_ans = max(ans, max_ans);
    }

    cout << max_ans;
}