본문 바로가기

Algorithm/Baekjoon BOJ

[백준][C++] 23757: 아이들과 선물 상자

반응형

 

https://www.acmicpc.net/problem/23757

 

23757번: 아이들과 선물 상자

모든 아이들이 실망하지 않고 각자 원하는 만큼 선물을 가져갈 수 있으면 $1$을, 그렇지 않으면 $0$을 출력한다.

www.acmicpc.net

 

 

 

 

 


- 문제

 

  N개의 선물 상자에 각각 c개의 선물이 들어 있고, M명의 아이들이 각자 w개의 선물을 받고 싶을 때 아이들이 주어진 순서대로 선물을 고를 때 모든 아이들이 선물을 받을 수 있는지 없는지 판별하는 문제다.

 

 


- 해설

https://stopthebackspace.tistory.com/123

 

위의 링크에서 우선순위 큐를 처음 사용해 보았고, 어떻게 사용해야 하는지 배웠기에, 큰 숫자가 먼저 튀어나오도록 우선순위큐를 만들어 사용하면 문제를 풀 수 있다.

 

 

나는 처음에 아이들까지도 우선순위큐로 정렬했었는데, 문제를 보니 1번 아이부터 M번 아이까지 한 번에 한명씩 가져간다고 되어 있어서, 얘네는 정렬할 필요가 없다는 것을 느끼고 일반 큐로 바꿔보니 정답이 되었다.

 

그렇다면, 여기선 안 바꿨지만 굳이 반복문을 3개 쓸 필요 없이 2번째 반복문, cin >> temp를 할때 바로 적용하면 더 빠르게 문제를 해결할 수 있을 것 같다. 

 


- 풀이

#include <iostream>
#include <queue>
using namespace std;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int N, M, temp;
    bool isDone = true;
    priority_queue<int, vector<int>, less<int>> box;
    queue<int> present;
    cin >> N >> M;
    for (int i = 0; i < N; i++)
    {
        cin >> temp;
        box.push(temp);
    }
    for (int i = 0; i < M; i++)
    {
        cin >> temp;
        present.push(temp);
    }
    while (!present.empty())
    {
        temp = box.top() - present.front();
        if (temp > 0)
        {
            box.pop();
            box.push(temp);
            present.pop();
        }
        else if (temp == 0)
        {
            box.pop();
            present.pop();
        }
        else
        {
            isDone = false;
            break;
        }
    }
    if (isDone)
    {
        cout << 1;
    }
    else
    {
        cout << 0;
    }

    return 0;
}

 

 


- 새롭게 알게 된 점

 

반응형

'Algorithm > Baekjoon BOJ' 카테고리의 다른 글

[백준][C++] 1063: 킹  (1) 2022.12.27
[백준][C++] 2293: 동전 1  (1) 2022.12.26
[백준][C++] 11286: 절대값 힙  (0) 2022.12.09
[백준][C++] 11401: 이항 계수 3  (0) 2022.12.08
[백준][C++] 2740: 행렬 곱셈  (0) 2022.11.21