[BOJ] 16236. ์๊ธฐ์์ด(python)
๐๋ฌธ์
๐ช์์ด๋์ด
์๊ธฐ์์ด ์์น๊ตฌํ๊ธฐ
์๊ธฐ์์ด์ ์์น๋ฅผ ๊ตฌํ๊ณ board์ ์๋ ์ซ์ ํฌ๊ธฐ๋ก ์ด๋ํ ์์๋์ง ์ฒดํฌํ ๋ ํผ๋์ ์ค์ด๊ธฐ ์ํด ์๊ธฐ์์ด์์น์ 0์ ๋์ ํ๋ค.์ฌ์ด์ฆ๋ณ ๋ฌผ๊ณ ๊ธฐ ๊ฐฏ์
๋จน์ ์ ์๋ ๋ฌผ๊ณ ๊ธฐ๊ฐ ๋จ์๋์ง ์ฌ๋ถ์ ๋ฐ๋ผ ์ด๋ํ๊ธฐ ์ํด ์ฌ์ด์ฆ๋ณ๋ก ๋ฌผ๊ณ ๊ธฐ์ ์ซ์๋ฅผ ์ธ์ด๋๋๋ค.- ๊ฐ์ฅ ๊ฐ๊น์ด ๋จน์ ์ ์๋ ๋ฌผ๊ณ ๊ธฐ ์์น
- ์ด๋ํ๊ธฐ
๋ณด๋์ ๊ฐ์ด ์๊ธฐ ์์ด์ ์ฌ์ด์ฆ ์ดํ๋ฉด ์ด๋ - ๋จน์ ๋ฌผ๊ณ ๊ธฐ ์์น ์ฒดํฌ
0์ด ์๋๊ณ ์๊ธฐ์์ด๋ณด๋ค ์์ผ๋ฉด ๋จน์ ์ ์๋ค. - ๋จน๋ ๋ฌผ๊ณ ๊ธฐ ์กฐ๊ฑด ์ฒดํฌ
๋จน์ ์ ์๋ ๋ฌผ๊ณ ๊ธฐ์ ์๊ธฐ์์ด๊ฐ ์์ง์ธ ๊ฑฐ๋ฆฌ, y์ขํ, x์ขํ๋ฅผ heap์ ๋ฃ๋๋ค. heappopํ๋ฉด ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ๊ฐ๊น์ด -> ๊ฐ์ฅ ์ -> ๊ฐ์ฅ ์ผ์ชฝ์ธ ๋จน์ ์ ์๋ ๋ฌผ๊ณ ๊ธฐ์ ์ขํ๋ฅผ ์ป์ ์ ์๋ค.
IndexError๊ฐ ๋ ์ ์ด๋ ค์ ๋๋ฐ ์ด๋ ๋จน์ ์ ์๋ ๋ฌผ๊ณ ๋ฆฌ๋ ์กด์ฌํ์ง๋ง ๊ทธ ์ฃผ์์ ์๊ธฐ ์์ด๋ณด๋ค ํฐ ๋ฌผ๊ณ ๊ธฐ๋ค ๋๋ฌธ์ ์ด๋ํ ์ ์์ด heap์ด ๋น์ด์๋ ์ํ์ผ ๋ ๋ฐ์ํ๋ค. ๊ทธ๋์ heap์ด ๋น์ด์๋ค๋ฉด None์ ๋ฐํํ๋๋ก ์ฒ๋ฆฌํ์๋ค.
- ์ด๋ํ๊ธฐ
ํด๋น ์์น ๋ฌผ๊ณ ๊ธฐ ๋จน๊ธฐ
๋จน์ ์ ์๋ ๋ฌผ๊ณ ๊ธฐ ์์น ์ฒดํฌํด์ None์ด๋ฉด ํ๋ก๊ทธ๋จ์ ์ข ๋ฃ์์ผฐ๋ค.
๊ฐ์ด ์์ผ๋ฉด ์๊ธฐ ์์ด๊ฐ ์ด๋ํ ๊ฑฐ๋ฆฌ๋งํผ ์๊ฐ์ด๋ฅผ ์ฌ๋ฆฌ๊ณ ํด๋น ์์น์ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์์ผ๋ ์๊ธฐ ์์ด๊ฐ ๋ฌผ๊ณ ๊ธฐ ๋จน์ ์๋ฅผ +1ํ๊ณ board์ ํด๋น ์์น๋ฅผ 0์ผ๋ก ๋ฐ๊พผ๋ค.- ์๊ธฐ์์ด ํฌ๊ธฐ ์ฒดํฌ
์๊ธฐ์์ด๊ฐ ๋จน์ ๋ฌผ๊ณ ๊ธฐ ์์ ์๊ธฐ ์์ด ํฌ๊ธฐ๊ฐ ๊ฐ์ผ๋ฉด ์๊ธฐ ์์ด๊ฐ ํฌ๊ธฐ +1ํ๊ณ ๋จน์ ์๋ 0์ผ๋ก ์ด๊ธฐํ์์ผ์ค๋ค.
์๊ธฐ ์์ด๊ฐ ์ปค์ก์ผ๋ ์๊ธฐ ์์ดํฌ๊ธฐ -1 ์ฌ์ด์ฆ์ ๋ฌผ๊ณ ๊ธฐ๋ค์ ๋จน์ ์ ์๊ฒ ๋์ด ๋จน์ ์ ์๋ ๋ฌผ๊ณ ๊ธฐ ๊ฐ์์ ๊ทธ๋งํผ ๋ํด์ค๋ค. ๋ฌผ๊ณ ๊ธฐ ์ฌ์ด์ฆ๋ 1~6๊น์ง ์๊ธฐ ๋๋ฌธ์ ์๊ธฐ ์์ด ํฌ๊ธฐ๊ฐ 6์ดํ์ผ ๊ฒฝ์ฐ์๋ง ์ด ๊ณผ์ ์ ์ฒ๋ฆฌํ๊ฒ ํ๋ค.
๐ฅ์ฝ๋
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import sys; input = sys.stdin.readline
from collections import deque
from heapq import heappush, heappop
class Baby:
def __init__(self) -> None:
self.y = 0
self.x = 0
self.size = 2
self.eatCnt = 0
def setLocation(self,y, x):
self.y = y
self.x = x
dy = (-1,0,1,0)
dx = (0,1,0,-1)
def findEatable():
visited = [[False for _ in range(n)] for _ in range(n)]
queue = deque()
queue.append((baby.y,baby.x,0))
visited[baby.y][baby.x] = True
target = []
while queue:
y,x,dist = queue.popleft()
if 0 < board[y][x] < baby.size:
heappush(target,(dist,y,x))
continue
for i in range(4):
ny, nx = y + dy[i], x + dx[i]
if 0 <= ny < n and 0 <= nx < n and not visited[ny][nx]:
if board[ny][nx] <= baby.size:
visited[ny][nx] = True
queue.append((ny,nx,dist+1))
if target: return heappop(target)
return None
def eatFish(y,x):
global eatableNum
board[y][x] = 0
eatableNum -= 1
baby.eatCnt += 1
baby.setLocation(y,x)
def sizeChk():
global eatableNum
if baby.eatCnt == baby.size:
if baby.size <= 6: eatableNum += fishes[baby.size]
baby.size += 1
baby.eatCnt = 0
n = int(input())
board = []
baby = Baby()
fishes = dict().fromkeys(range(1,7),0)
for i in range(n):
board.append(list(map(int,input().split())))
for j in range(n):
fishSize = board[i][j]
if fishSize == 9:
baby.setLocation(i,j)
board[i][j] = 0
elif 0 < fishSize:
fishes[fishSize] += 1
clock = 0
eatableNum = 0
eatableNum += fishes[1]
while eatableNum:
tmp = findEatable()
if not tmp: break
move, targetY, targetX = tmp
eatFish(targetY,targetX)
clock += move
sizeChk()
print(clock)
Comments powered by Disqus.