KEEP GOING
[python] 백준 1202번 : 보석 도둑 (정렬, heapq) 본문
반응형
https://www.acmicpc.net/problem/1202
1. 정답 코드
import heapq
from collections import deque
# 보석의 개수, 가방의 개수
n, k = map(int, input().split())
jewel = []
for _ in range(n):
# 보석의 무게, 보석의 가격
m, v = map(int, input().split())
jewel.append([m, v])
# 가방에 담을 수 있는 최대 무게
c = sorted([int(input()) for _ in range(k)])
jewel.sort(key=lambda x:(x[0], -x[1]))
result = 0
heap = []
# 큐에서 제일 작은 값 제거할 수 있는 방법(?)
for i in range(k):
while jewel and c[i] >= jewel[0][0]:
heapq.heappush(heap, -jewel[0][1])
heapq.heappop(jewel)
if heap:
result += heapq.heappop(heap)
if not heap and not jewel:
break
print(-result)
2. 틀린 코드
import heapq
from collections import deque
import sys
sys.stdin = open('1202.txt', 'r')
# 보석의 개수, 가방의 개수
n, k = map(int, input().split())
jewel = []
for _ in range(n):
# 보석의 무게, 보석의 가격
m, v = map(int, input().split())
jewel.append([m, v])
# 가방에 담을 수 있는 최대 무게
c = sorted([int(input()) for _ in range(k)])
jewel.sort(key=lambda x:(x[0], -x[1]))
result = 0
deq = deque(jewel)
heap = []
# 가방에 담을 수 있는 보석을 찾아보자
for i in range(k):
while deq:
# 가방이 담을 수 없는 보석이 등장했다면
if heap and c[i] < deq[0][0]:
result += (-heapq.heappop(heap))
break
# 가방이 담을 수 있는 보석인 경우
m, v = deq.popleft()
heapq.heappush(heap, -v)
print(result)
반례) 아래와 같은 testcase를 대입하면 아래와 같이 값이 들어온다. 가방의 무게가 15일 때 result에는 [8, 55]의 가격 55가 들어와야 한다. 하지만 if heap and c[i] < deq[0][0]: 가 동작하지 않으므로 heap에서 원소를 꺼낼 수 없다.
9 5
4 5
4 9
4 10
8 55
14 20
9 15
8 55
8 5
11 54
10
5
4
15
20
반응형
'code review > sort' 카테고리의 다른 글
[python] 프로그래머스 42626번 : 더 맵게 (heapq.heapify) (0) | 2022.04.04 |
---|---|
[python] 프로그래머스 42889번 : 실패율 (정렬, ZeroDivisionError) (0) | 2022.01.11 |
[python] 이것이코딩테스트다 : 커리큘럼 (위상정렬) (0) | 2022.01.10 |
[python] 프로그래머스 42579번 : 베스트 앨범 (0) | 2021.12.29 |
[python] 딕셔너리 정렬하기 (key/value 기준으로 sorted(), lambda, reverse 사용) (2) | 2021.12.28 |
Comments