본문 바로가기

알고리즘/Baekjoon

우선순위 큐. [1202]

[1. 문제 설명]

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


[2. 풀이 접근]

카테고리는 우선순위 큐를 이용해서 푸는 방법이지만,

map 을 이용해서 풀 수 도 있다.


map 을 이용한 풀이

기본적인 전략은 아래와 같다.

  • 훔친 보석의 가격을 최대로 해야 하므로,
  • 보석 가격 순을 내림차순 정렬 후, 하나 씩 가져가는 방식이다.
  • 이 때, 보석 무게가 도둑이 갖고 있는 가방 들 중 어느 하나에 포함될 수 있어야 한다.
  • 이 때 이분 탐색을 위해, 가방 무게 역시 오름차순으로 미리 정렬 되어 있어야 한다.

그래서 보석을 기준으로 iterate 하면서 보석을 선택적으로 취해 나가는 것이다.

단) 여기서 아래와 같은 문제가 있다.

  • 이번 보석을 어느 가방에 넣었으면, 이 가방은 다음 탐색에서 제외 되어야 한다.
  • 그런데, 이분 탐색하는 배열을 대상으로 특정 원소를 제거 하려면, O(KlogK) 시간 복잡도가 발생한다.
  • 바깥 for 문 까지 고려하면, O(NKlogK) 이므로 시간 초과가 발생할 것이다.  

그래서 배열을 대상으로 이분 탐색을 진행하지 않고,

std::map 을 대상으로 이분 탐색을 진행한다.

  • 별도 compare 를 지정하지 않으면, key 를 대상으로 오름 차순으로 정렬된다.
  • node 에 대한 insert 와 erase 를 O(logN) 에 할 수 있다.

마지막으로 주의 할 점은 동일한 무게를 갖는 가방이 여러 개 일 수 있다는 점이다.

그래서 map 에서 가방을 제거할 때, 해당 가방의 개수를 따로 counting 할 필요가 있다.


우선 순위 큐를 이용한 풀이

map 을 이용한 풀이와 조금 다르다.

여기서는 가방을 기준으로 iterate 한다.

  • 먼저, 보석과 가방 모두 무게를 기준으로 오름차순 정렬을 한다.
  • 가방을 기준으로 바깥 for 문을 만든다.
  • for 문 안쪽에서는 현재 가방에 넣을 수 있는 모든 보석의 가격을 MaxHeap 에 푸쉬한다.
  • 다음 보석을 이번 가방에 넣을 수 없는 경우,
  • 현재 MaxHeap 의 top 에 오는 보석의 가격을 전체 결과에 더해준다.

이 방법에서는 map 을 이용한 풀이에서 고민했던 문제를 해결 할 수 있다.

현재 가방에 담을 수 있는 보석을 선택하는 것이기 때문이다.


[3. 코드 - map 을 이용한]


[3. 코드 - 우선순위 큐를 이용한]

 

'알고리즘 > Baekjoon' 카테고리의 다른 글

우선순위 큐. [11000]  (0) 2023.03.02
우선순위 큐. [7662]  (0) 2023.02.27
트리-DP. [1949]  (0) 2023.02.24
트리. [2533]  (0) 2023.02.21
트리. [2250]  (0) 2023.02.20