문제 링크 - https://www.acmicpc.net/problem/1202
처음엔 배낭알고리즘 문제로 생각했으나 조건에 가방에 들어갈 수 있는 보석의 수는 최대 1개인걸 알고 그리디하게 풀면 되는 문제로 파악했다. (조건 최대 30만개 가방 c의 개수가 최대 1억개 , 제한시간 1초 - > dp활용 배낭알고리즘으로 풀게되면 시간초과 예상)
생각
1.보석은 무게 기준으로 정렬, 가방도 크기 기준으로 정렬 ,
2.가방들을 하나씩 순회하며 가방보다 적거나 같은 무게를 가진 보석들 중 가치가 가장 큰 보석 담기
3, 보석의 중복을 막기 위해 가방에 담긴 보석의 가치를 0으로 변경
4.가방의 무게 이하로 포함된다면 무게값은 필요가 없고, 가치가 가장 높은것만 고르면 됨
최초코드
import sys
import heapq
input= sys.stdin.readline
n,k =map(int,input().split())
#각 가방에 담을 수 있는 최대 무게는 Ci이다. 가방에는 최대 한 개의 보석만 넣을 수 있다.
#보석은 무게 Mi와 가격 Vi
jewel = [list(map(int,input().split())) for __ in range(n)]
#가방 중복판매 방지 -> 가방에 담은 보석의 가치 0으로 변경
bags = []
for __ in range(k):
bags.append(int(input().rstrip()))
jewel.sort()
bags.sort()
print(jewel)
print(bags)
values= [] #가치가 제일 큰 보석만 뽑으면 됨
now = 0
result = 0
for bw in bags:
for i in range(now,len(jewel)):# 틀리는 부분이 여기일거같은데
if jewel[i][0]<=bw:
heapq.heappush(values,-jewel[i][1])
else:
break
now = i #가방 범위 이내의 인덱스 모두 방문해야함
if values: # 0개일떄 인덱스 오류 발생
result-=heapq.heappop(values)
print(result)
10퍼센트에서 틀림
반례
4 4
1 100
10 500
13 300
2 200
13
13
13
13
-> 인덱스를 변수 now가 문제였다 보석 마지막까지 다 순회하고 보석을 values에 모두 넣었다면 더 이상 for문으로 순회하지 말아야하는데 계속해서 마지막 보석을 values에 넣어줘서 문제가 보석값이 복사가 되었다.
import sys
import heapq
input= sys.stdin.readline
n,k =map(int,input().split())
#각 가방에 담을 수 있는 최대 무게는 Ci이다. 가방에는 최대 한 개의 보석만 넣을 수 있다.
#보석은 무게 Mi와 가격 Vi
jewel = [list(map(int,input().split())) for __ in range(n)]
#가방 중복판매 방지 -> 가방에 담은 보석의 가치 0으로 변경
bags = []
for __ in range(k):
bags.append(int(input().rstrip()))
jewel.sort()
bags.sort()
values= [] #가치가 제일 큰 보석만 뽑으면 됨
now = 0
flag= 0
result = 0
for bw in bags:
for i in range(now,len(jewel)):# 틀리는 부분이 여기일거같은데
if flag: # for문 모두 순회했다면 플래그 설정
break
if jewel[i][0]<=bw:
heapq.heappush(values,-jewel[i][1])
if i == len(jewel)-1:
flag=1
else:
break
now = i #가방 범위 이내의 인덱스 모두 방문해야함
if values: # 0개일떄 인덱스 오류 발생
result-=heapq.heappop(values)
print(result)
보석을 모두 순회했다면 flag True로 만들어서 더이상 보석을 추가하지 않게 만들었다.
flag 사용말고도 wihle문이나 큐를 통해 원소를 제거하게 만들어도 괜찮을것같다
'알고리즘 > Baekjoon' 카테고리의 다른 글
백준 13776 Alpha Puzzle (0) | 2024.07.10 |
---|---|
백준 1520 내리막길 python (0) | 2024.05.07 |
백준 17404 RGB 거리 2 (0) | 2024.05.03 |