ํ’€์ด


์ฒ˜์Œ์œผ๋กœ ์—ฐ์Šตํ•ด๋ณธ BFS ๋ฌธ์ œ์ด๋‹ค. ์ฒ˜์Œ ์ ‘ํ•˜๋˜ ์œ ํ˜•์ด๋‹ค๋ณด๋‹ˆ ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ๋งŽ์ด ์ฐธ๊ณ ํ–ˆ๋‹ค.

์ฃผ์–ด์ง„ ํ™˜๊ฒฝ์—์„œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๋‚ด์— ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์œผ๋ฉด์„œ ๋” ์ด์ƒ ๋จน์„ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์—†์–ด์งˆ ๋•Œ ๊นŒ์ง€ ์•„๊ธฐ ์ƒ์–ด๋ฅผ ํ‚ค์šฐ๋Š” ๋ฌธ์ œ์ด๋‹ค.

์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์—์„œ๋Š” BFS ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ์•Œ๊ณ  ์žˆ์—ˆ์ง€๋งŒ ์–ด๋–ค ์‹์œผ๋กœ ์‘์š”ํ•ด์•ผํ•˜๋Š”์ง€ ๋ชฐ๋ผ ๋งŽ์ด ํ•ด๋งธ๋‹ค.

์šฐ์„  ์ž…๋ ฅ์„ ๋ฐ›์œผ๋ฉด์„œ ์ฒ˜์Œ ์•„๊ธฐ ์ƒ์–ด์˜ ์œ„์น˜๋ฅผ ์ €์žฅํ•ด์ค€๋‹ค.

ํ˜„์žฌ ์•„๊ธฐ ์ƒ์–ด์˜ ํฌ๊ธฐ ๋ฐ ์œ„์น˜๋ฅผ ๊ณ ๋ คํ•ด์„œ ์•„๊ธฐ ์ƒ์–ด๊ฐ€ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ฌผ๊ณ ๊ธฐ์˜ ์œ„์น˜์™€ ๊ฑฐ๋ฆฌ๋ฅผ BFS ๋ฅผ ํ†ตํ•ด ๋ฐ˜ํ™˜ํ•œ๋‹ค.

BFS ๋ฅผ ๋Œ๋ฆฌ๋ฉด์„œ ์•„๊ธฐ ์ƒ์–ด๊ฐ€ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋Š” ์ขŒํ‘œ์— ๋Œ€ํ•˜์—ฌ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ ๋ฐ ๊ฑฐ๋ฆฌ๋ฅผ ์ขŒํ‘œ์— ๋”ฐ๋ผ ์ €์žฅํ•ด์ค€ ๋’ค, ์•„๊ธฐ ์ƒ์–ด๊ฐ€ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ edible ๋ฆฌ์ŠคํŠธ์— ์ขŒํ‘œ์™€ ๊ฑฐ๋ฆฌ๋ฅผ ์ €์žฅํ•ด์ค€๋‹ค.

์ดํ›„ ๋ชจ๋“  ํƒ์ƒ‰์ด ๋๋‚˜๋ฉด edilbe ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฑฐ๋ฆฌ, ๋งจ์œ„, ๋งจ์™ผ์ชฝ ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ ๋’ค ๊ฐ€์žฅ ์ฒซ ๋ฒˆ์งธ ์›์†Œ๊ฐ’๋“ค์„ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.

์ดํ›„ ์•„๊ธฐ ์ƒ์–ด์˜ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ๋ฌธ์ œ ์กฐ๊ฑด์— ๋”ฐ๋ผ์„œ ๋จน์€ ๋ฌผ๊ณ ๊ธฐ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ €์žฅํ•ด์ค€๋‹ค.

๋งŒ์•ฝ ์•„๊ธฐ ์ƒ์–ด๊ฐ€ ๋จน์€ ๊ฐœ์ˆ˜๊ฐ€ ์ž๊ธฐ ๋ชธ์ง‘๊ณผ ๊ฐ™์•„์งˆ ๊ฒฝ์šฐ ์•„๊ธฐ ์ƒ์–ด์˜ ๋ชธ์ง‘์„ ํ‚ค์šด ๋’ค ๋ฐ˜๋ณตํ•œ๋‹ค.

๋งŒ์•ฝ ๋” ์ด์ƒ ์•„๊ธฐ ์ƒ์–ด๊ฐ€ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ํƒ์ƒ‰์—์„œ ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š์„ ์‹œ -1 ์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•˜๊ณ  -1 ์ด ๋ฐ˜ํ™˜๋˜๋ฉด ๋ฐ˜๋ณต๋ฌธ์„ ์ข…๋ฃŒํ•œ ๋’ค ์ด๋™ํ•œ ์ด ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅํ•ด์ฃผ๋ฉด๋œ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ†ตํ•ด ๊ฐ ์ƒํ™ฉ๋งˆ๋‹ค ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ BFS ๋กœ ๋ฐ˜ํ™˜๋ฐ›๊ณ  ๋” ์ด์ƒ ๋งž๋Š” ์กฐ๊ฑด์„ ์ฐพ์„ ์ˆ˜ ์—†์„ ๋•Œ ๊นŒ์ง€ 2์ฐจ์› ๋ฐฐ์—ด์„ ์ˆ˜์ •ํ•ด์ฃผ๋ฉด์„œ ๋ฐ˜๋ณต์„ ํ•ด์•ผํ•œ๋‹ค๋Š” ์ ์„ ์•Œ๊ฒŒ๋˜์—ˆ๋‹ค.

์†Œ์Šค์ฝ”๋“œ


# ์•„๊ธฐ ์ƒ์–ด
 
from collections import deque
import sys
 
input = sys.stdin.readline
 
 
def bfs(i, j):  # i, j ์ขŒํ‘œ์—์„œ ํ˜„์žฌ ์•„๊ธฐ ์ƒ์–ด๊ฐ€ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋ฌผ๊ณ ๊ธฐ์˜ ์œ„์น˜ ๋ฐ ๊ฑฐ๋ฆฌ ์ฐพ๊ณ  ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ฌผ๊ณ ๊ธฐ์˜ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜
    visited = [[0] * n for i in range(n)]
    visited[i][j] = 1
    edible = []
    dist = [[0] * n for i in range(n)]
    q = deque()
    q.append([i, j])
    while q:
        x, y = q.popleft()
        for k in range(4):
            nx = x + dx[k]
            ny = y + dy[k]
            if 0 <= nx < n and 0 <= ny < n and visited[nx][ny] == 0:  # ํ•œ๋ฒˆ๋„ ๊ฐ„ ์ ์ด ์—†์œผ๋ฉฐ ๋ฒ”์œ„ ๋‚ด์ผ ๋•Œ
                if s[nx][ny] <= s[i][j] or s[nx][ny] == 0:  # ์ž๊ธฐ๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ 0 ์ผ ๊ฒฝ์šฐ ์ด๋™ ๊ฐ€๋Šฅ
                    q.append([nx, ny])
                    visited[nx][ny] = 1  # ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
                    dist[nx][ny] = dist[x][y] + 1
                if s[nx][ny] < s[i][j] and s[nx][ny] != 0:  # ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ์ผ ๊ฒฝ์šฐ
                    edible.append([nx, ny, dist[nx][ny]])  # ๊ทธ ๋ฌผ๊ณ ๊ธฐ์˜ ์ขŒํ‘œ ๋ฐ ๊ฑฐ๋ฆฌ๋ฅผ ์ €์žฅ
    if not edible:  # ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ
        return -1, -1, -1
    edible.sort(key=lambda x: (x[2], x[0], x[1]))  # ๊ฑฐ๋ฆฌ, ๋งจ์œ„, ๋งจ์™ผ์ชฝ ์ˆœ์œผ๋กœ ์ •๋ ฌ
    return edible[0][0], edible[0][1], edible[0][2]
 
 
dx = [1, -1, 0, 0]
dy = [0, 0, -1, 1]
 
n = int(input())
s = []
for i in range(n):
    a = list(map(int, input().split()))
    s.append(a)
    for j in range(n):
        if a[j] == 9:  # ์•„๊ธฐ ์ƒ์–ด ์œ„์น˜ ํ™•์ธ
            s[i][j] = 2
            start = [i, j]
 
exp = 0
cnt = 0
 
while True:
    i, j = start[0], start[1]
    ex, ey, dist = bfs(i, j)
    if ex == -1: break
    s[ex][ey] = s[i][j]  # ์•„๊ธฐ ์ƒ์–ด๊ฐ€ bfs ๋ฅผ ํ†ตํ•ด ์ฐพ์€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋จน์ด๋ฅผ ๋จน๊ณ  ๋‚œ ํ›„์˜ ์œ„์น˜
    s[i][j] = 0
    start = [ex, ey]  # ์ƒˆ๋กœ์šด ์‹œ์ž‘ ์œ„์น˜ ์„ค์ •
    exp += 1  # ํ•œ ๋งˆ๋ฆฌ ๋จน์—ˆ๋‹ค๋Š” ์ •๋ณด๋ฅผ ์ €์žฅ
    if exp == s[ex][ey]:  # ์ž์‹ ์˜ ํฌ๊ธฐ์™€ ๊ฐ™์€ ์ˆซ์ž์˜ ๋ฌผ๊ณ ๋ฆฌ๋ฅผ ๋จน์—ˆ์„ ๋•Œ
        s[ex][ey] += 1  # ํฌ๊ธฐ๊ฐ€ 1๋งŒํผ ์ปค์ง
        exp = 0  # ์ดˆ๊ธฐํ™”
    cnt += dist
 
print(cnt)

References