jujuwon
시크릿주주
jujuwon
전체 방문자
오늘
어제
  • 분류 전체보기 (106)
    • 🔠 프로그래밍언어 (35)
      • ☕️ Java (19)
      • 🐠 Python (15)
      • 🍠 Kotlin (1)
    • 🔙 Backend (16)
      • 🌿 Springboot (12)
      • 🐳 Docker (1)
      • ☁️ AWS (3)
    • 💼 CS (12)
      • 📶 Network (12)
    • 🕹 알고리즘 (14)
      • 📑 스터디 (2)
      • 💁🏻‍♂️ 백준 (9)
      • 👨🏼‍🔬 프로그래머스 (3)
    • 📚 Book (8)
      • 🔎 오브젝트 (4)
      • 🧪 TDD (2)
      • 📜 논문 (2)
    • 🔐 보안 (7)
      • 👾 Pwnable (7)
    • 📝 회고 (4)
    • 🧩 etc. (10)
      • ⚠️ issue (2)
      • 💡 꿀팁 (7)
      • ✏️ 끄적 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

최근 글

hELLO · Designed By 정상우.
jujuwon

시크릿주주

백준 :: 1202번 보석 도둑 (Python)
🕹 알고리즘/💁🏻‍♂️ 백준

백준 :: 1202번 보석 도둑 (Python)

2023. 5. 13. 10:00
반응형

문제 링크

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

 

접근 방식

먼저 각 가방에 담을 수 있는 보석의 최대 가격을 구하는 문제라서

보석을 가격 순으로 내림차순 정렬하고 가방마다 보석을 순회하면서 최대한 높은 가격의 보석을 담으려고 했다.

하지만 그렇게 생각하고 제약사항을 봤는데 보석과 가방의 개수가 각각 최대 30만..

내가 생각한 풀이의 시간복잡도를 계산해보면 30만의 제곱이라서 이 풀이는 패스..

그렇다면 전체를 순회하지 말고 최대값을 어떻게 뽑아낼 수 있을까..? → 여기가 핵심 !

우선순위큐 를 이용해서 풀면 될 것 같았다 !

각 가방에 대해 반복문을 돌면서 해당 가방이 담을 수 있는 무게까지 보석들을 우선순위 큐에다가 넣고,

(우선순위 큐는 MaxHeap 으로, 큐에 넣을 때는 보석의 가격으로 !)

다 넣었으면 루트 노드만 pop 하는 식으로 구현하면 바로 담을 수 있는 최대 가격을 알 수 있다.

여기서 시간복잡도를 계산해보자.

가방을 전체 순회하는 데에 O(N), 우선순위 큐에서는 삽입, 삭제 시 O(logN) 이니까

O(NlogN) 이 걸릴 것이다.

이제 코드로 옮겨보자 !

풀이 코드

import sys
import heapq
from collections import deque

def input():
    return sys.stdin.readline().rstrip()

N, K = map(int, input().split())
gems = []

for _ in range(N):
    M, V = map(int, input().split())
    gems.append((M, V))

bags = []
for _ in range(K):
    bags.append(int(input()))

# 보석 무게 오름차순 정렬
gems.sort(key = lambda x : (x[0], -x[1]))
gems = deque(gems)
bags.sort()
result = 0
queue = []

for bag in bags:
    while gems and gems[0][0] <= bag: # 가방에 담을 수 있는 무게보다 커지면 break
        gem = gems.popleft()
        heapq.heappush(queue, -gem[1])
    if queue:
        result -= heapq.heappop(queue)

print(result)

치열한 고민의 흔적..

끝.

728x90
반응형
저작자표시 (새창열림)
    '🕹 알고리즘/💁🏻‍♂️ 백준' 카테고리의 다른 글
    • 백준 :: 1213번 팰린드롬 만들기 (Python)
    • 백준 :: 1254번 팰린드롬 만들기 (Python)
    • 백준 :: 1541번 잃어버린 괄호 (Python)
    • 백준 :: 10951번 A+B-4 (Java, Python)
    jujuwon
    jujuwon

    티스토리툴바