๋ฌธ์
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

'๐ป CS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
HTTP ์ ๋ฆฌ ๋ฐ ์ง๋ฌธ ๋ฆฌ์คํธ (feat.RESTful) (0) | 2025.03.22 |
---|---|
๋ก๋ ๋ฐธ๋ฐ์ (Load Balancer) (0) | 2025.03.10 |
200๋ ๊ฐ ํ๊ด์๋ จํ๋๋ PS ์ต๊ฐ์๊ฐ ๋ ๊ฑด์ ๋ํ์ฌ (0) | 2025.02.18 |
[SQL] ์๋์ฐจ ๋์ฌ ๊ธฐ๋ก์์ ๋์ฌ์ค / ๋์ฌ ๊ฐ๋ฅ ์ฌ๋ถ ๊ตฌ๋ถํ๊ธฐ (ํ๋ก๊ทธ๋๋จธ์ค/Level 3) (5) | 2025.02.11 |
0-1 Knapsack Problem ์ต์ ํ (DP ๋ฉ๋ชจ๋ฆฌ) (0) | 2025.01.04 |