Point ๐Ÿ’ก


  1. ๋„ˆ๋น„์šฐ์„ ํƒ์ƒ‰(BFS)๋กœ ์ƒ์–ด์˜ ํ˜„์žฌ ์œ„์น˜์—์„œ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.

    1. ํ์—์„œ ํ˜„์žฌ ์ด๋™์œ„์น˜๋ฅผ ๊บผ๋‚ด ํ˜„์žฌ ์ด๋™์œ„์น˜์—์„œ ์ƒํ•˜์ขŒ์šฐ๋กœ ํƒ์ƒ‰ํ•œ๋‹ค.
    2. ์ด๋™ ๊ฐ€๋Šฅ(= ์ƒ์–ด์˜ ์‚ฌ์ด์ฆˆ๋ณด๋‹ค ๋ฌผ๊ณ ๊ธฐ์˜ ์‚ฌ์ด์ฆˆ๊ฐ€ ๊ฐ™๊ฑฐ๋‚˜ ์ž‘์„๋•Œ)ํ•˜๋‹ค๋ฉด ํ์— ์ถ”๊ฐ€ํ•œ๋‹ค.
      1. ์ด๋•Œ, ์ƒ์–ด์˜ ์‚ฌ์ด์ฆˆ๋ณด๋‹ค ๋ฌผ๊ณ ๊ธฐ์˜ ์‚ฌ์ด์ฆˆ๊ฐ€ ์ž‘๊ณ , 0์ด ์•„๋‹ˆ๋ผ๋ฉด, ์‹์‚ฌ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•œ๋‹ค.
    3. ํ๊ฐ€ ๋น„์–ด์žˆ์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.
    4. ๋ฐ˜๋ณต์ด ๋๋‚œ ํ›„ ์‹์‚ฌ๋ฆฌ์ŠคํŠธ๋ฅผ ์šฐ์„ ์ˆœ์œ„๋Œ€๋กœ ์ •๋ ฌํ•ด์„œ returnํ•œ๋‹ค.
      1. ์šฐ์„ ์ˆœ์œ„ : ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€๊นŒ์šด ๋ฌผ๊ณ ๊ธฐ > ๊ฐ€์žฅ ์œ„์— ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ > ๊ฐ€์žฅ ์™ผ์ชฝ์— ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ
  2. BFS ํ•จ์ˆ˜๋ฅผ while๋ฌธ์œผ๋กœ ๊ณ„์† ๋Œ๋ฆฌ๋ฉด์„œ, ํ•จ์ˆ˜๊ฐ€ ํ•œ๋ฒˆ ๋๋‚ ๋•Œ๋งˆ๋‹ค ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ ๋ฆฌ์ŠคํŠธ์—์„œ ๊ฐ€์žฅ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ๋ฌผ๊ณ ๊ธฐ ํ•œ ๋งˆ๋ฆฌ๋ฅผ ๋จน๋Š”๋‹ค.

    1. ์‹œ๊ฐ„๊ณผ ์ƒ์–ด์˜ ์œ„์น˜๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
    2. ๋จน์€ ๋ฌผ๊ณ ๊ธฐ ๊ฐœ์ˆ˜๋ž‘ ์ƒ์–ด ์‚ฌ์ด์ฆˆ๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
    3. ๋งŒ์•ฝ, ๋” ์ด์ƒ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ๊ณต๊ฐ„์— ์—†๋‹ค๋ฉด ์—„๋งˆ์ƒ์–ด์—๊ฒŒ ๋„์›€ ์š”์ฒญํ•˜๋ฉด์„œ while๋ฌธ์„ ์ข…๋ฃŒํ•œ๋‹ค.

์ด ๋ฌธ์ œ์˜ ํ•ด๊ฒฐ ํ‚คํฌ์ธํŠธ๋Š” ****ํƒ์ƒ‰ ๊ณผ์ •๊ณผ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๊ณ  ์—…๋ฐ์ดํŠธ ์‹œํ‚ค๋Š” ๊ณผ์ •์„ ๋ถ„๋ฆฌํ•œ ๊ฒƒ์ด๋‹ค!

My Solution



import sys
from collections import deque

# readlline ๋’ค์— ๊ด„ํ˜ธ๋ฅผ ๋„ฃ์œผ๋ฉด ์—๋Ÿฌ๊ฐ€ ์ƒ๊น€ ์กฐ์‹ฌ!
input = sys.stdin.readline
n = int(input())
space = []

# ์ƒ์–ด์˜ ์œ„์น˜์™€ ํฌ๊ธฐ
shark_x, shark_y, shark_size = 0, 0, 2

for i in range(n):
    space.append(list(map(int, input().split())))
    for j in range(n):
        if space[i][j] == 9:
            shark_x = i
            shark_y = j

# ์ƒํ•˜์ขŒ์šฐ
dx, dy = [0, 0, 1, -1], [1, -1, 0, 0]

def eat_fish(x, y, shark_size):
    visited = [[0] * n for _ in range(n)]
    # ์ด๋™ํ•œ ๊ฑฐ๋ฆฌ
    distance = [[0] * n for _ in range(n)]

    queue = deque()
    queue.append((x, y))
    visited[x][y] = 1
    # ์‹์‚ฌ ๋ฆฌ์ŠคํŠธ
    fishes = []

    while queue:
        cur_x, cur_y = queue.popleft()

        for i in range(4):
            nx, ny = cur_x + dx[i], cur_y + dy[i]

            if 0 <= nx < n and 0 <= ny < n and visited[nx][ny] == 0:
                # ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด
                if space[nx][ny] <= shark_size:
                    queue.append((nx, ny))
                    visited[nx][ny] = 1
                    distance[nx][ny] = distance[cur_x][cur_y] + 1

                    if space[nx][ny] < shark_size and space[nx][ny] != 0:
                        fishes.append((nx, ny, distance[nx][ny]))

    # ์šฐ์„ ์ˆœ์œ„ : ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€๊นŒ์šด ๋ฌผ๊ณ ๊ธฐ > ๊ฐ€์žฅ ์œ„์— ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ > ๊ฐ€์žฅ ์™ผ์ชฝ์— ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ
    # ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ด์•ผ pop ํ–ˆ์„ ๋•Œ ๊ฐ€์žฅ ๋’ค์— ์žˆ๋Š” ๊ฐ’์ด ๊ฐ€์žฅ ์ ํ•ฉํ•œ fish!
    return sorted(fishes, key=lambda x: (-x[2], -x[0], -x[1]))

time = 0
count = 0
while True:
    eatable_fishes = eat_fish(shark_x, shark_y, shark_size)

    # ๋” ์ด์ƒ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ๊ณต๊ฐ„์— ์—†๋‹ค๋ฉด ์—„๋งˆ์ƒ์–ด์—๊ฒŒ ๋„์›€ ์š”์ฒญ
    if len(eatable_fishes) == 0:
        break

    # ๋จน์„ ๋ฌผ๊ณ ๊ธฐ pick <- ์ด๋ฏธ ์ •๋ ฌ๋œ ์ƒํƒœ
    nx, ny, dist = eatable_fishes.pop()

    # ์›€์ง์ด๋Š” ์นธ ์ˆ˜ = ์‹œ๊ฐ„
    time += dist

    # ์ƒ์–ด๊ฐ€ ์žˆ์—ˆ๋˜ ์œ„์น˜์™€ ๋จน์€ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ์—ˆ๋˜ ์œ„์น˜๋ฅผ 0์œผ๋กœ ๋งŒ๋“ค๊ธฐ
    space[shark_x][shark_y], space[nx][ny] = 0, 0

    # ์ƒ์–ด ์ขŒํ‘œ๋ฅผ ๋จน์€ ๋ฌผ๊ณ ๊ธฐ ์ขŒํ‘œ๋กœ ์ด๋™
    shark_x, shark_y = nx, ny

    # ๋จน์€ ๋ฌผ๊ณ ๊ธฐ ๊ฐœ์ˆ˜๋ž‘ ์ƒ์–ด ์‚ฌ์ด์ฆˆ ์—…๋ฐ์ดํŠธ
    count += 1
    if count == shark_size:
        shark_size += 1
        count = 0

print(time)