[백준] 1781번 컵라면 (C++)

2025. 12. 1. 10:38·Algorithm
728x90

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

 

 

이 문제는 컵라면 종류가 주어지고 각 컵라면마다 데드라인, 개수가 주어진다. 이때 최대로 얻을 수 있는 컵라면 개수를 출력하는 문제이다.

 

컵라면을 얻기 위해 문제를 풀어야 하는데 한 문제를 풀때 1시간이 걸린다.

 

이때 숙제의 개수가 최대 20만이다.

 

처음 생각한 방법은 20만 배열을 만들어 컵라면 개수를 내림차순으로 정렬하여 

 

일자 인덱스에 기록되지 않은 경우 더해주며 만약 이미 기록된 경우 현재 일자부터 1씩 감소시키면서 빈 날짜를 찾아서 할당 해 줄 생각을 하였다.

 

하지만 이는 시간복잡도가 최대 O(N^2)으로 시간초과가 나는 코드이므로 다른 방법을 생각했어야 했다.

 

결국 데드라인이 있을때 그 데드라인에 맞춰 최대로 먹어야 한다. 필자는 최소 힙을 사용하여 날짜 순으로 오름차순 정렬하였다.

 

최소힙이 의미하는 것은 지정한 날짜를 확인했을때 최대로 먹을 수 있는 컵라면 개수를 담는 컨테이너이다.

그렇게 되면 

(1, 6)

(1, 7)

(2, 4)

(2, 5)

(3, 1)

(3, 2)

(6, 1)
로 되며

순차적으로 힙에 컵라면 개수를 넣어준다. 이때 우선순위 큐의 크기가 데드라인보다 커지는 경우 이는 한정된 데드라인에 해당 힙에 크기만큼 컵라면 개수를 먹을 수 없기 때문에 가장 작은 컵라면 개수(top)부분을 빼주었다.

 

 

정답코드

#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
#define endl "\n"
#define MAX 1e9

struct coordinate {
    int x;
    int y;
    int r;
};

struct halloween {
    int cnt;
    int score;
};

// int dx[] = {-1, 1, 0, 0, 1, -1, -1, 1};
// int dy[] = {0, 0, -1, 1, -1, 1, -1, 1};
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
int N;
vector<pii> v;

void solve() {
    sort(v.begin(), v.end());

    priority_queue<int, vector<int>, greater<int>> pq;

    for(auto it : v) {
        int day = it.first;
        int cost = it.second;
        pq.push(it.second);

        if(day < pq.size()) {
            pq.pop();
        }
    }

    ll answer = 0;
    while(!pq.empty()) {
        answer += pq.top();
        pq.pop();
    }

    cout << answer;
}

void input() {
    cin >> N;

    for(int i = 0; i < N; i++) {
        int a, b;
        cin >> a >> b;
        v.push_back({a, b});
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);

    input();
    solve();
}

 

 

728x90
저작자표시 (새창열림)

'Algorithm' 카테고리의 다른 글

[백준] 1826번 연료 채우기 (C++)  (0) 2025.12.03
[백준] 2613번 숫자구슬 (C++)  (0) 2025.12.02
[백준] 16441번 아기돼지와 늑대 (C++)  (0) 2025.11.30
[백준] 7453번 합이 0인 네 정수 (C++)  (0) 2025.11.29
[백준] 17485번 진우의 달 여행 (Large) (C++)  (1) 2025.11.28
'Algorithm' 카테고리의 다른 글
  • [백준] 1826번 연료 채우기 (C++)
  • [백준] 2613번 숫자구슬 (C++)
  • [백준] 16441번 아기돼지와 늑대 (C++)
  • [백준] 7453번 합이 0인 네 정수 (C++)
쿨쿨.
쿨쿨.
  • 쿨쿨.
    All of the life
    쿨쿨.
  • 전체
    오늘
    어제
    • 분류 전체보기 (279)
      • Programming (47)
        • C, C++ (18)
        • Python (6)
        • Java (1)
        • HTML,CSS,JS (3)
        • SQL(DB) (13)
        • SpringBoot (3)
        • Android (2)
        • CI,CD (1)
      • Algorithm (173)
        • Review (4)
      • Security (14)
        • WebHacking (3)
        • Websecurity (11)
      • OS (19)
        • Linux (12)
        • Mac os (2)
      • 머신러닝 (1)
      • CS(Computer Science) (12)
        • 컴퓨터 네트워크 (3)
        • 컴퓨터 구조 (1)
        • 인공지능 (8)
      • Docker (1)
      • Dev Book Review (3)
        • Clean Code (1)
        • Effective Java (0)
        • Real MySQL (2)
      • SWM (1)
      • Review (6)
      • AWS (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    비트마스킹
    정렬
    우선순위 큐
    c언어
    이분탐색
    코딩
    누적합
    wargame
    투포인터
    재귀
    백준
    에라토스테네스의 체
    그래프 이론
    Leviathan
    BFS
    우선순위큐
    Bandit
    브루트포스
    시뮬레이션
    WebSecurity
    linux
    그리디
    다이나믹 프로그래밍
    구현
    깊이우선탐색
    백트래킹
    DP
    트리
    DFS
    다익스트라
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.6
쿨쿨.
[백준] 1781번 컵라면 (C++)
상단으로

티스토리툴바