이 영역을 누르면 첫 페이지로 이동
hoonDEV 블로그의 첫 페이지로 이동

hoonDEV

페이지 맨 위로 올라가기

hoonDEV

BOJ 1202 - 보석 도둑 문제풀이

  • 2020.04.20 01:17
  • 알고리즘/문제풀이

문제를 읽고 이해하기

세계적인 도둑 상덕이는 보석점을 털기로 결심했다.

상덕이가 털 보석점에는 보석이 총 N개 있다. 각 보석은 무게 Mi와 가격 Vi를 가지고 있다. 상덕이는 가방을 K개 가지고 있고, 각 가방에 담을 수 있는 최대 무게는 Ci이다. 가방에는 최대 한 개의 보석만 넣을 수 있다.

상덕이가 훔칠 수 있는 보석의 최대 가격을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N과 K가 주어진다. (1 ≤ N, K ≤ 300,000)

다음 N개 줄에는 각 보석의 정보 Mi와 Vi가 주어진다. (0 ≤ Mi, Vi ≤ 1,000,000)

다음 K개 줄에는 가방에 담을 수 있는 최대 무게 Ci가 주어진다. (1 ≤ Ci ≤ 100,000,000)

모든 숫자는 양의 정수이다.

출력

첫째 줄에 상덕이가 훔칠 수 있는 보석 가격의 합의 최댓값을 출력한다.

재정의와 추상화

이 문제는 STL의 multiset을 모른다면 꽤 애를 먹을 수 있는 문제이다. (자주 사용하는 STL 컨테이너는 다 외워두자..)

  1. 입력받은 보석 정보는 보석의 가치에 대한 내림차순으로 우선순위 큐에 담아둔다.
  2. multiset을 이용하여 가방의 최대 무게 정보를 저장한다. 이때, multiset의 특징에 따라 오름차순 정렬된다.
  3. 우선순위 큐에 있는 원소가 하나도 없을 때까지 아래 과정을 진행한다.
    1. 우선순위 큐 최상단에 있는 보석의 무게를 m이라고 할 때, m 이상의 무게를 담을 수 있는 가방들 중 첫 번째 것을 찾는다.
    2. 찾았을 경우, 담은 보석의 가치 총합(result)에 우선순위 큐 최상단에 있는 보석의 가치 v를 더해준다.
    3. 그리고, 사용한 가방은 multiset에서 제거(erase)해준다. -> 시간복잡도 logn
    4. 보석을 가방에 담든, 담지 않든 최상단의 보석은 사용했거나 더 이상 사용하지 않을 것이므로 우선순위 큐에서 제거해준다.

코드 작성

#include <iostream>
#include <algorithm>
#include <set>
#include <queue>
#define ULL unsigned long long
using namespace std;

priority_queue<pair<int, int>> pq;
multiset<int> ms;

ULL result = 0;

int main() {
    cin.sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    int n, k;
    cin >> n >> k;
    for (int i = 0; i < n; i++) {
        int m, v;
        cin >> m >> v;
        pq.push({v, m});
    }
    for (int i = 0; i < k; i++) {
        int c;
        cin >> c;
        ms.insert(c);
    }

    while (!pq.empty()) {
        int v = pq.top().first;
        int m = pq.top().second;

        auto it = ms.lower_bound(m);
        if (it != ms.end()) {
            result += v;
            ms.erase(it);
        }

        pq.pop();
    }
    cout << result;
    return 0;
}

'알고리즘 > 문제풀이' 카테고리의 다른 글

BOJ 2003 - 수들의 합 2 문제풀이  (0) 2020.04.19
BOJ 10942 - 팰린드롬? 문제풀이  (0) 2020.04.19
BOJ 1806 - 부분합 문제풀이  (0) 2020.04.19
BOJ 12015 - 가장 긴 증가하는 부분 수열 2 문제풀이  (0) 2020.04.19
BOJ 1074 - Z 문제풀이  (0) 2020.04.18

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • BOJ 2003 - 수들의 합 2 문제풀이

    BOJ 2003 - 수들의 합 2 문제풀이

    2020.04.19
  • BOJ 10942 - 팰린드롬? 문제풀이

    BOJ 10942 - 팰린드롬? 문제풀이

    2020.04.19
  • BOJ 1806 - 부분합 문제풀이

    BOJ 1806 - 부분합 문제풀이

    2020.04.19
  • BOJ 12015 - 가장 긴 증가하는 부분 수열 2 문제풀이

    BOJ 12015 - 가장 긴 증가하는 부분 수열 2 문제풀이

    2020.04.19
다른 글 더 둘러보기

정보

hoonDEV 블로그의 첫 페이지로 이동

hoonDEV

  • hoonDEV의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그

카테고리

  • 분류 전체보기 (91)
    • 일상 (13)
      • 후기 (1)
      • 계획 (11)
    • 공지사항 (1)
    • 알고리즘 (54)
      • 문제풀이 (53)
      • 이론 (1)
    • 공부 (19)
      • React (0)
      • Angular (5)
      • Java (3)
      • C, C++ (3)
      • JavaScript (6)
      • WEB (2)
    • 디자인 (1)
      • UI, UX (1)
    • 개발 (0)
      • boom (0)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • 알고리즘
  • 그리디
  • 백준
  • 문제풀이
  • dp
  • javascript
  • es6
  • 이분탐색

나의 외부 링크

정보

훈개발자의 hoonDEV

hoonDEV

훈개발자

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © 훈개발자. Designed by Fraccino.

티스토리툴바