Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- stepexecutionlistener
- 선언적 트랜잭션 관리
- step 값 공유
- executioncontext 변수 공유
- job parameter
- step 여러개
- 스프링 트랜잭션 관리
- flatfileitemwriter
- 읽기 작업과 쓰기 작업 분리
- JSONArray 분할
- spring batch 변수 공유
- 스프링배치 엑셀
- JSON 분할
- 마이바티스 트랜잭션
- JSON 분리
- step 사이 변수 공유
- 스프링배치 메타테이블
- 트랜잭션 분리
- JSONObject 분할
- mybatis
- 스프링 배치 5
- 아이템 리더 커스텀
- executioncontext
- api 아이템 리더
- aop proxy
- abstractpagingitemreader
- 스프링배치 csv
- Spring Batch
- 아이템 리더 페이징 처리
- spring batch 5
Archives
- Today
- Total
ebson
boj.kr/1202 보석 도둑 (gold2) 파이썬 풀이 본문
오답풀이
- 제시된 2개 테스트 케이스는 통과했으나 제출시 시간초과했다.
import sys
input = sys.stdin.readline
N, K = map(int, input().split())
items = []
for _ in range(N):
items.append(list(map(int, input().split())))
from collections import deque
bags = deque()
for _ in range(K):
bags.append(int(input()))
items = sorted(items, key = lambda x:x[1], reverse=True)
tot = 0
for item in items:
# av_bags = sorted(list(filter(lambda x: x>=item[0], bags)))
av_bags = [x for x in bags if x>=item[0]]
if len(av_bags) > 0:
bags.remove(min(av_bags))
tot += item[1]
print(tot)
정답풀이
- 우선순위큐를 사용해 최소 가방무게 찾기, 최대 가격의 보석 찾기, 요소 삭제 연산을 하면 이중 for문을 돌 때 보다 연산횟수를 절약할 수 있다.
1. 최소 heapq으로 [보석무게, 보석가격] 들을 모두 저장
2. 최소 heapq으로 가방의 무게들을 모두 저장
3. 가방들을 모두 순회하면서 아래를 반복
3.1. 가방들 중 최소용량을 가지는 가방을 heappop
3.2. 보석정보 목록이 비어있지 않고 꺼낸 가방이 존재하는 보석중 최소무게 이상의 용량인 경우 아래를 반복
3.2.1. 보석목록에서 해당 보석을 heappop하고 최대 heapq으로 해당 보석의 가격을 저장
3.3. 최대 heapq에 저장된 보석 가격이 있으면, 그중 최대값을 heappop하여 총합 tot 변수에 더하기
3.4. 보석들을 모두 heappop했으면 반복문을 종료
4. 총합 tot 변수 값을 출력
import sys
input = sys.stdin.readline
N, K = map(int, input().split())
import heapq
items = []
for _ in range(N):
heapq.heappush(items, list(map(int, input().split())))
bags = []
for _ in range(K):
heapq.heappush(bags, int(input()))
tot = 0
temp_items = []
while bags:
bag = heapq.heappop(bags)
while items and bag >= items[0][0]:
heapq.heappush(temp_items, -heapq.heappop(items)[1])
if temp_items:
tot += -heapq.heappop(temp_items)
elif not items:
break
print(tot)
최소힙과 최대힙을 사용하면 최소값과 최대값을 O(logN)의 시간복잡도로 찾을 수 있다.
참고출처
"[백준] 1202 - 보석 도둑 💎 (Python) / 골드 2 / 정렬 / 그리디", bio-info.tistory.com, 2022년 10월 21일 수정, 2023년 6월 12일 접속, https://bio-info.tistory.com/195.
'ALGORITHM STUDY WITH PYTHON > Greedy' 카테고리의 다른 글
boj.kr/11000 강의실 배정 (gold5) 파이썬 풀이 (0) | 2023.05.14 |
---|---|
boj.kr/1744 수 묶기 (gold4) 파이썬 풀이 (0) | 2023.05.14 |
boj.kr/1339 단어 수학 (gold4) 파이썬 풀이 (0) | 2023.05.09 |
boj.kr/1946 신입사원 (silver1) 파이썬 풀이 (0) | 2023.05.08 |
boj.kr/1715 카드 정렬하기 (gold4) 파이썬 풀이 (0) | 2023.05.08 |