티스토리 뷰

알고리즘

백준 1202 - 파이썬

취뽀가자!! 2023. 4. 22. 20:49

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

 

1202번: 보석 도둑

첫째 줄에 N과 K가 주어진다. (1 ≤ N, K ≤ 300,000) 다음 N개 줄에는 각 보석의 정보 Mi와 Vi가 주어진다. (0 ≤ Mi, Vi ≤ 1,000,000) 다음 K개 줄에는 가방에 담을 수 있는 최대 무게 Ci가 주어진다. (1 ≤ Ci

www.acmicpc.net

문제 해결

이 문제를 처음에 보고 생각난 풀이 방법은 다음과 같다.

 

1. 가방무게와 보석무게 모두 정렬 후 첫번째 보석부터 차례대로 진행

2. 현재 보석의 무게를 모든 가방에 넣을 수 있다면, 최대 무게가 가장 적은 가방에 입력.

3. 만약 가방에 이미 다른 보석이 먼저 있다면, 먼저 들어있는 보석과 현재 넣으려 하는 보석의 가격 비교하여 더 비싼 보석 넣음.

4. 위 과정 반복 후 가방에 있는 모든 보석의 가격 합한 후 출력

 

코드는 아래와 같다.

import sys

n, k = map(int, sys.stdin.readline().split())

jewelList = []
bagWeight = []
bagList = [0] * k

for _ in range(n):
  jewelList.append(tuple(map(int, sys.stdin.readline().split())))

for _ in range(k):
  bagWeight.append(int(sys.stdin.readline()))

jewelList.sort()
bagWeight.sort()

# jewelList = [(1, 65), (2, 99), (5, 23)]
# bagWeight = [2, 10]

for i in range(k):
  for j in range(n):
    if jewelList[j][0] < bagWeight[i]:
      if bagList[i] == 0:
        bagList[i] = jewelList[j][1]
      else:
        if bagList[i] < jewelList[j][1]:
          bagList[i] = jewelList[i][1]
          
print(sum(bagList))

하지만 위 풀이는 시간 초과가 났다. 혹시나 다른 방법이 있나 고민해봤지만 찾지 못하여 다른 사람의 풀이를 찾아 보왔다.

 

import sys
import heapq

n, k = map(int, sys.stdin.readline().split())
jew = []

for _ in range(n):
  heapq.heappush(jew, list(map(int, sys.stdin.readline().split())))

bags = []

for _ in range(k):
  bags.append(int(sys.stdin.readline()))

bags.sort()

answer = 0
tmp_jew = []
for bag in bags:
  while jew and bag >= jew[0][0]:
    heapq.heappush(tmp_jew, -heapq.heappop(jew)[1])

  if tmp_jew:
    answer -= heapq.heappop(tmp_jew)
  elif not jew:
    break

print(answer)

아이디어 자체는 나와 동일하지만 차이점을 찾아 본다면 최대힙과 최소힙을 사용하였다는 점이다.

핵심은 파이썬의 heapq는 맨 앞에 있는 수를 기준으로 최소힙 정렬된다는 점을 활용하여, 처음에는 보석의 무게와 가치를 저장하여 무게를 기준으로 정렬을 진행하며 heappop을 진행하였고, 가방보다 무게가 작은 보석을 tmp_jew에 최대힙으로 저장하였다. 이 과정을 가방의 개수만큼 반복하여 추출하게 되면 가방에 들어갈 수 있는 보석 중 가치가 가장 높은 보석의 합을 구할 수 있게 된다.

 

이번 문제를 풀면서 느낀 점은 문제를 푸는 아이디어를 떠올리는것도 중요하지만 기존에 이미 구현된 자료구조를 활용하여 시간을 단축하는 것 또한 중요한 것 같다. 아직 힙이나 스택, 큐 등의 자료구조를 활용하는것이 익숙하지는 않지만 계속 사용하면서 익숙해져야 되겠다.

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

백준 2212 - 파이썬  (0) 2023.04.23
백준 11000 - 파이썬  (0) 2023.04.23
백준 1339 - 파이썬  (0) 2023.04.19
백준 1439 - 파이썬  (0) 2023.04.17
백준 16953 - 파이썬  (0) 2023.04.16
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함