새로운 블로그로 이전 작업을 진행하고 있어 포스트가 새로 작성되고 있지 않습니다.

빠른 시일 내에 새로운 블로그로 인사드리겠습니다.

새로운 블로그 : https://unho.vercel.app/

본문 바로가기
알고리즘 문제풀이/Python

[백준] 1202 보석 도둑

by 언호 2022. 4. 9.

📖 문제


🧑🏻‍💻 풀이 과정

1) 문제 이해 및 접근

가방에 담을 수 있는 모든 보석들 중 가장 가치가 높은것을 담으면 최대 가치를 얻을 수 있습니다.

그리디 방식으로 접근하여 풀이했습니다.

2) 알고리즘

  • 그리디

3) 풀이 코드

사용 언어 - Python

import sys
import heapq
from collections import deque
sys.stdin = open('input.txt')

N, K = map(int, sys.stdin.readline().split())                                                                   # 보석의 개수, 가방의 개수
gems = deque(sorted([list(map(int, sys.stdin.readline().split())) for _ in range(N)], key=lambda x: x[0]))      # 각 보석의 무게와 가격들을 보석의 무게순으로 오름차순
backpacks = sorted([int(sys.stdin.readline()) for _ in range(K)])                                               # 가방을 가벼운 순서대로 정렬
answer = 0

available = []                                      # 담을 수 있는 보석들
for backpack in backpacks:                          # 가벼운 가방부터 탐색 시작
    while gems and backpack >= gems[0][0]:          # 보석 리스트에 보석이 남아있고, 현재 가방에 들어갈 수 있다면
        heapq.heappush(available, -gems[0][1])      # 보석의 무게를 음수로 하여 저장 (heapq는 최소힙 -> 음수를 저장하여 최대힙으로 활용)
        gems.popleft()                              # 보석 리스트의 가장 앞의 보석을 삭제

    if available:                                   # 담을 수 있는 보석이 있다면
        answer += -heapq.heappop(available)         # 가장 가치가 높은 보석을 가방에 담음


print(answer)

📝 결과 및 학습한 내용

1) 어려웠던 내용

보석은 가치순으로 내림차순으로 정렬하여 리스트 생성하였고, 가방은 담을 수 있는 무게순으로 오름차순하여 리스트 생성하였습니다.

이후, 보석을 하나씩 확인하며 보석의 무게와 같거나 큰 가방들을 이분탐색으로 탐색하였고, 정답을 찾는 방식을 이용하였습니다.

 

그러나 위의 과정에서 두개의 리스트의 길이에는 변화가 있지 않고 탐색을 진행하다보니 시간 복잡도가 높아 시간 초과가 발생하였습니다.

 

이후 탐색 시간을 줄이기 위하여 deque 와 최대힙을 이용하여 해결하였습니다.

2) 새롭게 학습한 내용

특별히 없습니다.


🔗 문제 링크

- 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

 

 

※ 오류 및 오타, 다른 의견이 있는 경우 댓글을 남겨주시면 감사하겠습니다

'알고리즘 문제풀이 > Python' 카테고리의 다른 글

[백준] 1918 후위 표기식  (0) 2022.04.11
[백준] 17070 파이프 옮기기 1  (0) 2022.04.10
[백준] 2749 피보나치 수 3  (0) 2022.04.02
[백준] 1987 알파벳  (0) 2022.03.31
[백준] 10800 컬러볼  (0) 2022.03.30