본문 바로가기
코딩/백준-파이썬

백준 1202번: 보석 도둑

by 철없는민물장어 2022. 7. 13.
728x90

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

문제

세계적인 도둑 상덕이는 보석점을 털기로 결심했다.

상덕이가 털 보석점에는 보석이 총 N개 있다. 각 보석은 무게 Mi와 가격 Vi를 가지고 있다. 상덕이는 가방을 K개 가지고 있고, 각 가방에 담을 수 있는 최대 무게는 Ci이다. 가방에는 최대 한 개의 보석만 넣을 수 있다.

상덕이가 훔칠 수 있는 보석의 최대 가격을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N과 K가 주어진다. (1 ≤ N, K ≤ 300,000)

다음 N개 줄에는 각 보석의 정보 Mi와 Vi가 주어진다. (0 ≤ Mi, Vi ≤ 1,000,000)

다음 K개 줄에는 가방에 담을 수 있는 최대 무게 Ci가 주어진다. (1 ≤ Ci ≤ 100,000,000)

모든 숫자는 양의 정수이다.

출력

첫째 줄에 상덕이가 훔칠 수 있는 보석 가격의 합의 최댓값을 출력한다.


기록

 

내가 생각한 풀이법:

1. 보석의 정보를 가치를 기준으로 내림차순 정렬하여 비싼 순서대로 정렬되게 함

2. 가방이 들 수 있는 무게는 오름차순 정렬하여 최대무게가 낮은 순으로 정렬되게 함

3. 가방에 넣을 수 있는 가장 비싼 보석을 찾아 넣음 (1,2에서 정렬을 해놓았기 때문에 반복문만 사용하면 간단하게 됨)

 

n,k=map(int,input().split()) #보석개수 n, 가방개수 k개 입력받기

L_Mi=[] #보석의 무게 리스트
L_Vi=[] #보석의 가치 리스트
for i in range(n):
    Mi,Vi=map(int,input().split())
    L_Mi.append(Mi)
    L_Vi.append(Vi)

jewel=list(zip(L_Mi,L_Vi)) 
jewel.sort(key=lambda x:x[1],reverse=True) #보석의 가치를 기준으로 내림차순 정렬

L_Ci=[] #가방이 들 수 있는 무게 리스트
for i in range(k):
    Ci=int(input())
    L_Ci.append(Ci)

L_Ci.sort() #오름차순 정렬
result=0

for i in range(len(L_Ci)): #가방개수만큼 반복
    
    for j in range(len(jewel)): #보석개수만큼 반복
        
        if(L_Ci[i]>=jewel[j][0]): #보석무게보다 가방으로 들 수 있는 무게가 클때
            result+=jewel[j][1] #가격 더함
            jewel.pop(j) #보석 삭제
            break

    
print(result)

결과

 

작동은 되는데...

시간초과때문에 통과를 못했다

리스트에서 pop()을 하게되면 정렬하는데 시간이 많이걸린다는데 그래서인가?

 

궁금해서 답안을 찾아보니 대부분의 사람들이 우선순위큐를 사용해서 푼 것 같다.

다음엔 우선순위큐를 배워서 이 문제를 다시 풀어봐야겠다.

728x90

'코딩 > 백준-파이썬' 카테고리의 다른 글

백준 7576번: 토마토  (0) 2022.07.14
백준 2606번: 바이러스  (0) 2022.07.13
백준 2178번: 미로 탐색  (0) 2022.07.13
백준 1260번: DFS와 BFS  (0) 2022.07.13
백준 1012번: 유기농 배추  (0) 2022.07.13

댓글