๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป CS

๋ฐฑ์ค€ 21279๋ฒˆ ๊ด‘๋ถ€ ํ˜ธ์„ - Python

by dev.py 2025. 3. 29.

 

๋ฌธ์ œ

https://www.acmicpc.net/problem/21279

 

 

์‹œ๋„ํ–ˆ์ง€๋งŒ ์‹คํŒจํ•œ ๋ฐฉ๋ฒ•

  • BFS(?) ๋ฐฉ๋ฒ•์œผ๋กœ mines[x][y] = mines[x-1][y] + mines[x][y-1] - mines[x-1][y-1] + mineral[x][y] -> O(W*H)๋กœ ์‹คํŒจ
  • ๋ชจ๋“  ํฌ์ธํŠธ๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ๋„ฃ์–ด์„œ ์ฒ˜๋ฆฌ -> O(N^2)๋กœ ์‹คํŒจ

 

๋งˆ์ง€๋ง‰์€ ํˆฌํฌ์ธํ„ฐ + set์„ ํ™œ์šฉํ–ˆ๋‹ค.

 

import sys
from collections import defaultdict
input = sys.stdin.readline
n, cash = map(int, input().split())

x_gems = defaultdict(list) # x์ขŒํ‘œ์— ์žˆ๋Š” ๋ณด์„๋“ค
y_gems = defaultdict(list) # y์ขŒํ‘œ์— ์žˆ๋Š” ๋ณด์„๋“ค

for _ in range(n):
    x, y, v = map(int, input().split())
    x_gems[x].append((y, v))
    y_gems[y].append((x, v))


result = 0
cost = 0 # ๋ณด์„ ์ฑ„๊ตด ๋น„์šฉ = ๋ณด์„ ๊ฐฏ์ˆ˜
value = 0
x = 100_000 # x์ขŒํ‘œ ์ตœ๋Œ€๊ฐ’
y = 0 # y์ขŒํ‘œ ์ตœ์†Œ๊ฐ’


bag = set()

while x >= 0 and y <= 100_000:
    if cost <= cash: # ๊ฐ€๋ฐฉ์— ๋” ๋„ฃ์„์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ
        for _x, v in y_gems[y]:
            if _x <= x:
                bag.add((_x, y))
                cost += 1
                value += v
        y += 1
    else:
        for _y, v in x_gems[x]:
            if (x, _y) in bag: # ์ด๋ฏธ ๊ฐ€๋ฐฉ์— ์žˆ๋Š” ๋ณด์„์ด๋ผ๋ฉด
                bag.remove((x, _y))
                cost -= 1
                value -= v
        x -= 1

    if cost <= cash: # ํŒŒ์‚ฐํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
        result = max(result, value)

print(result)

 

 

 

 

ํˆฌ ํฌ์ธํ„ฐ๋กœ๋งŒ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ๋Š” y๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ๋ณด์„๋“ค์„ ๋นผ๋‚ด์—ˆ๋Š”๋ฐ,  ์ด์ „์— ๋นผ๋‚ธ ๋ณด์„๋“ค์˜ y ์ขŒํ‘œ๋“ค์„ ๊ด€๋ฆฌํ•ด์„œ ๋”์ด์ƒ ๊ทธ y์ขŒํ‘œ ์ด์ƒ ๊ฐ’๋“ค์€ ์„ ํƒํ•˜์ง€ ์•Š๋„๋ก ์ œ์–ดํ•˜๋Š” ๋ถ€๋ถ„์ด ์–ด๋ ค์›Œ set() ๊ตฌ์กฐ๋ฅผ ํ™œ์š”ํ•ด์„œ ๊ฐ€๋ฐฉ์— ์žˆ๋Š” ๊ฒฝ์šฐ๋งŒ ๋นผ๋„๋ก ์ˆ˜์ •ํ•˜์˜€๋‹ค.

 

# ์ด์ „
for _y, v in x_gems[x]:
    if _y <= y:
        cost -= 1
        value -= v


# ์ดํ›„
for _y, v in x_gems[x]:
    if (x, _y) in bag: # ์ด๋ฏธ ๊ฐ€๋ฐฉ์— ์žˆ๋Š” ๋ณด์„์ด๋ผ๋ฉด
        bag.remove((x, _y))
        cost -= 1
        value -= v