๐Ÿ“Algorithm & Codingtest/์˜ค๋‹ต๋…ธํŠธ

[BOJ 1202] ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์šฐ์„ ์ˆœ์œ„ ํ์™€ ํž™

Hush 2022. 7. 11. 11:21

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

์˜ค๋‹ต ์ฝ”๋“œ

import sys
sys.setrecursionlimit(1000000)

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


def BinarySearch(array, target):
    if len(array) == 0:
        return None
    left = 0
    right = len(array)-1
    while left <= right:
        mid = (left + right)//2
        if array[mid] == target:
            return mid
        elif array[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    if array[mid] < target:
        if mid == len(array)-1:
            return None
        return mid+1
    else:
        return mid


jewel_num, bag_num = map(int, FastInput().split())
jewel_list=[]
for i in range(jewel_num):
    jewel_weight , jewel_price = map(int, FastInput().split())
    jewel_list.append((jewel_price, jewel_weight))

bag_storage_list = []
for i in range(bag_num):
    bag_max_weight = int(FastInput())
    bag_storage_list.append(bag_max_weight)

jewel_list.sort()
jewel_list.reverse()
bag_storage_list.sort()

total_price = 0
for jewel_price, jewel_weight in jewel_list:
    appro_bag_idx = BinarySearch(bag_storage_list, jewel_weight)
    if appro_bag_idx == None:
        continue
    total_price += jewel_price
    # del(bag_storage_list[appro_bag_idx])
    bag_storage_list = bag_storage_list[:appro_bag_idx] + bag_storage_list[appro_bag_idx+1:]

print(total_price)

#๋ฆฌ์ŠคํŠธ๊ฐ€ ์—„์ฒญ ํด ๋•Œ ์ผํšŒ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด, del ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ง€๋‚˜์น˜๊ฒŒ ์—ฐ์‚ฐ์ด ๋งŽ์•„์ง„๋‹ค.

๊ฐ€์žฅ ๋น„์‹ผ ๋ณด์„๋ถ€ํ„ฐ ์ตœ๋Œ€ํ•œ ์ž‘์€ ๊ฐ€๋ฐฉ์— ๋„ฃ์–ด๋ณด๋Š” ๋ฐฉ์‹์ด๋‹ค.

๊ธฐ๋ณธ์ ์ธ ์„ค๊ณ„ ์ž์ฒด๋Š” ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ํฌ์ง€ ์•Š์•„ ๋ณด์˜€์œผ๋‚˜

์ •๋ ฌ๋œ ๋ฆฌ์ŠคํŠธ์—์„œ ์›์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ์ œ๊ฑฐํ•˜๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ์ด ์‹œ๊ฐ„์ดˆ๊ณผ๋ฅผ ์•ผ๊ธฐํ–ˆ๋‹ค.

 

del ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ O(n)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด, ๋ถ€์ ์ ˆํ•˜์˜€๋‹ค.

 

ํž™์„ ํ™œ์šฉํ•œ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ํ†ตํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ๋ชจ๋ฒ”๋‹ต์•ˆ์ด์—ˆ๋‹ค.

๋ชจ๋ฒ”๋‹ต์•ˆ

import sys
import heapq

input = sys.stdin.readline
n, k = map(int, input().split())
items = []
bag = []
candi = []
answer = 0
for _ in range(n):
    # ๋ณด์„ ๋ฌด๊ฒŒ ๊ธฐ์ค€ ์ตœ์†Œ ํž™ ์‚ฝ์ž…
    heapq.heappush(items, list(map(int, input().split())))
for _ in range(k):
    bag.append(int(input()))
# ๊ฐ€๋ฐฉ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
bag = sorted(bag)

for cap in bag:
    # ๊ฐ€๋ฐฉ ์ž‘์€๊ฑฐ ๋ถ€ํ„ฐ ๊บผ๋‚ด๋ฉด์„œ ๊ทธ ๊ฐ€๋ฐฉ์— ๋“ค์–ด๊ฐ€๋Š” ๋ณด์„์ผ๋‹จ ๋‹ค ๊บผ๋ƒ„.
    # ๊บผ๋‚ด์„œ ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์ตœ๋Œ€ํž™์— ๋„ฃ์Œ
    while items and items[0][0] <= cap:
        heapq.heappush(candi, -heapq.heappop(items)[1])
    # candi์— ํ˜„์žฌ ๊ฐ€๋ฐฉ์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋ณด์„ ๋‹ค๋“ค์–ด์žˆ์Œ.(์ตœ๋Œ€ํž™)
    # ์ด ์ค‘ ํ•˜๋‚˜ ๋นผ๋ฉด ๋จ.
    if candi:
        answer += abs(heapq.heappop(candi))
print(answer)

ํž™ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

๋˜ํ•œ ๋‚ด ํ’€์ด์™€ ๋‹ฌ๋ฆฌ ๊ฐ€์žฅ ๋น„์‹ผ ๋ณด์„์„ ๊ฐ€์žฅ ๊ฐ€๋ฒผ์šด ๊ฐ€๋ฐฉ์— ๋„ฃ๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐ€์žฅ ๊ฐ€๋ฒผ์šด ๊ฐ€๋ฐฉ์— ๊ฐ€์žฅ ๋น„์‹ผ ๋ณด์„์„ ๋„ฃ๋Š” ๋ฐฉ์‹์œผ๋กœ ์„ค๊ณ„ํ•˜์˜€๋‹ค.

 

Feedback

  1. ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ’€ ๋•Œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋‹ค๊ฐ์ ์œผ๋กœ ๊ณ ๋ฏผํ•˜์ž
  2. ์˜ค๋ฆ„์ฐจ์ˆœ, ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ, ํž™ ์ž๋ฃŒ๊ตฌ์กฐ์˜ ์‚ฌ์šฉ์œผ๋กœ del ํ•จ์ˆ˜์— ์˜์กดํ•˜๋Š” ์ƒํ™ฉ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Œ์„ ๊ธฐ์–ตํ•˜์ž.