[BOJ][๐ŸŸก3][๋ฐฑ์ค€#16236] ์•„๊ธฐ ์ƒ์–ด

์ž‘์„ฑ:    

์—…๋ฐ์ดํŠธ:

์นดํ…Œ๊ณ ๋ฆฌ:

ํƒœ๊ทธ: , , ,

๋ฌธ์ œ ์ถœ์ฒ˜

BAEKJOON Online Judge #16236


๋ฌธ์ œ

Nร—N ํฌ๊ธฐ์˜ ๊ณต๊ฐ„์— ๋ฌผ๊ณ ๊ธฐ M๋งˆ๋ฆฌ์™€ ์•„๊ธฐ ์ƒ์–ด 1๋งˆ๋ฆฌ๊ฐ€ ์žˆ๋‹ค. ๊ณต๊ฐ„์€ 1ร—1 ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜• ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ํ•œ ์นธ์—๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์ตœ๋Œ€ 1๋งˆ๋ฆฌ ์กด์žฌํ•œ๋‹ค. ์•„๊ธฐ ์ƒ์–ด์™€ ๋ฌผ๊ณ ๊ธฐ๋Š” ๋ชจ๋‘ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ์ด ํฌ๊ธฐ๋Š” ์ž์—ฐ์ˆ˜์ด๋‹ค. ๊ฐ€์žฅ ์ฒ˜์Œ์— ์•„๊ธฐ ์ƒ์–ด์˜ ํฌ๊ธฐ๋Š” 2์ด๊ณ , ์•„๊ธฐ ์ƒ์–ด๋Š” 1์ดˆ์— ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•œ ํ•œ ์นธ์”ฉ ์ด๋™ํ•œ๋‹ค. ์•„๊ธฐ ์ƒ์–ด๋Š” ์ž์‹ ์˜ ํฌ๊ธฐ๋ณด๋‹ค ํฐ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์€ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์—†๊ณ , ๋‚˜๋จธ์ง€ ์นธ์€ ๋ชจ๋‘ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ์•„๊ธฐ ์ƒ์–ด๋Š” ์ž์‹ ์˜ ํฌ๊ธฐ๋ณด๋‹ค ์ž‘์€ ๋ฌผ๊ณ ๊ธฐ๋งŒ ๋จน์„ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ, ํฌ๊ธฐ๊ฐ€ ๊ฐ™์€ ๋ฌผ๊ณ ๊ธฐ๋Š” ๋จน์„ ์ˆ˜ ์—†์ง€๋งŒ, ๊ทธ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์€ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ์•„๊ธฐ ์ƒ์–ด๊ฐ€ ์–ด๋””๋กœ ์ด๋™ํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

๋” ์ด์ƒ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ๊ณต๊ฐ„์— ์—†๋‹ค๋ฉด ์•„๊ธฐ ์ƒ์–ด๋Š” ์—„๋งˆ ์ƒ์–ด์—๊ฒŒ ๋„์›€์„ ์š”์ฒญํ•œ๋‹ค. ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ 1๋งˆ๋ฆฌ๋ผ๋ฉด, ๊ทธ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์œผ๋Ÿฌ ๊ฐ„๋‹ค. ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ 1๋งˆ๋ฆฌ๋ณด๋‹ค ๋งŽ๋‹ค๋ฉด, ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์œผ๋Ÿฌ ๊ฐ„๋‹ค.

๊ฑฐ๋ฆฌ๋Š” ์•„๊ธฐ ์ƒ์–ด๊ฐ€ ์žˆ๋Š” ์นธ์—์„œ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์œผ๋กœ ์ด๋™ํ•  ๋•Œ, ์ง€๋‚˜์•ผํ•˜๋Š” ์นธ์˜ ๊ฐœ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’์ด๋‹ค. ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€๊นŒ์šด ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ๋งŽ๋‹ค๋ฉด, ๊ฐ€์žฅย ์œ„์— ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ, ๊ทธ๋Ÿฌํ•œ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์—ฌ๋Ÿฌ๋งˆ๋ฆฌ๋ผ๋ฉด, ๊ฐ€์žฅ ์™ผ์ชฝ์— ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๋Š”๋‹ค.

์•„๊ธฐ ์ƒ์–ด์˜ ์ด๋™์€ 1์ดˆ ๊ฑธ๋ฆฌ๊ณ , ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค. ์ฆ‰, ์•„๊ธฐ ์ƒ์–ด๊ฐ€ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์œผ๋กœ ์ด๋™ํ–ˆ๋‹ค๋ฉด, ์ด๋™๊ณผ ๋™์‹œ์— ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๋Š”๋‹ค. ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์œผ๋ฉด, ๊ทธ ์นธ์€ ๋นˆ ์นธ์ด ๋œ๋‹ค. ์•„๊ธฐ ์ƒ์–ด๋Š” ์ž์‹ ์˜ ํฌ๊ธฐ์™€ ๊ฐ™์€ ์ˆ˜์˜ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์„ ๋•Œ ๋งˆ๋‹ค ํฌ๊ธฐ๊ฐ€ 1 ์ฆ๊ฐ€ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํฌ๊ธฐ๊ฐ€ 2์ธ ์•„๊ธฐ ์ƒ์–ด๋Š” ๋ฌผ๊ณ ๊ธฐ๋ฅผ 2๋งˆ๋ฆฌ ๋จน์œผ๋ฉด ํฌ๊ธฐ๊ฐ€ 3์ด ๋œ๋‹ค. ๊ณต๊ฐ„์˜ ์ƒํƒœ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์•„๊ธฐ ์ƒ์–ด๊ฐ€ ๋ช‡ ์ดˆ ๋™์•ˆ ์—„๋งˆ ์ƒ์–ด์—๊ฒŒ ๋„์›€์„ ์š”์ฒญํ•˜์ง€ ์•Š๊ณ  ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์žก์•„๋จน์„ ์ˆ˜ย ์žˆ๋Š”์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.


์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๊ณต๊ฐ„์˜ ํฌ๊ธฐ N(2ย โ‰ค N โ‰ค 20)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ๊ณต๊ฐ„์˜ ์ƒํƒœ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ณต๊ฐ„์˜ ์ƒํƒœ๋Š” 0, 1, 2, 3, 4, 5, 6, 9๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , ์•„๋ž˜์™€ ๊ฐ™์€ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„๋‹ค.

0: ๋นˆ ์นธ 1, 2, 3, 4, 5, 6: ์นธ์— ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ์˜ ํฌ๊ธฐ 9: ์•„๊ธฐ ์ƒ์–ด์˜ ์œ„์น˜

์•„๊ธฐ ์ƒ์–ด๋Š” ๊ณต๊ฐ„์— ํ•œ ๋งˆ๋ฆฌ ์žˆ๋‹ค.


์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์•„๊ธฐ ์ƒ์–ด๊ฐ€ ์—„๋งˆ ์ƒ์–ด์—๊ฒŒ ๋„์›€์„ ์š”์ฒญํ•˜์ง€ ์•Š๊ณ  ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์žก์•„๋จน์„ ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•œ๋‹ค.


์˜ˆ์ œ

์˜ˆ์ œ 1

์ž…๋ ฅ

3
0 0 0
0 0 0
0 9 0


์ถœ๋ ฅ

0


์˜ˆ์ œ 2

์ž…๋ ฅ

3
0 0 1
0 0 0
0 9 0


์ถœ๋ ฅ

3


์˜ˆ์ œ 3

์ž…๋ ฅ

4
4 3 2 1
0 0 0 0
0 0 9 0
1 2 3 4


์ถœ๋ ฅ

14


์˜ˆ์ œ 4

์ž…๋ ฅ

6
5 4 3 2 3 4
4 3 2 3 4 5
3 2 9 5 6 6
2 1 2 3 4 5
3 2 1 6 5 4
6 6 6 6 6 6


์ถœ๋ ฅ

60


์˜ˆ์ œ 5

์ž…๋ ฅ

6
6 0 6 0 6 1
0 0 0 0 0 2
2 3 4 5 6 6
0 0 0 0 0 2
0 2 0 0 0 0
3 9 3 0 0 1


์ถœ๋ ฅ

48


์˜ˆ์ œ 6

์ž…๋ ฅ

6
1 1 1 1 1 1
2 2 6 2 2 3
2 2 5 2 2 3
2 2 2 4 6 3
0 0 0 0 0 6
0 0 0 0 0 9


์ถœ๋ ฅ

39


My Sol

from collections import deque

def find_shark():
    global mat, N, ki, kj
    for i in range(N):
        for j in range(N):
            if mat[i][j] == 9:
                ki, kj = i, j
                return


def find_target():
    global N, mat, time
    global ki, kj, k_size, k_stack

    ti = tj = min_dis = 500
    mi, mj = ki, kj
    visit = [[0]*N for _ in range(N)]
    visit[mi][mj] = 1
    Q = deque()
    Q.append((0, mi, mj))
    while Q:
        m_dis, mi, mj = Q.popleft()
        # ํ˜„์žฌ ์ตœ์†Œ ๊ธธ์ด๋ณด๋‹ค ๊ธธ๋ฉด continue
        if m_dis > min_dis: continue
        for di, dj in [(-1,0),(0,-1),(0,1),(1,0)]:
            si, sj = mi+di, mj+dj
            # ๋ฒ”์œ„๋ฅผ ๋„˜์–ด์„œ๋ฉด continue
            if not (0<=si<N and 0<=sj<N): continue
            # ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋ฉด continue
            if visit[si][sj]: continue
            # ํฌ๊ธฐ๊ฐ€ ๋” ํฌ๋‹ค๋ฉด continue
            if mat[si][sj] > k_size: continue

            visit[si][sj] = 1
            # ํฌ๊ธฐ๊ฐ€ 0์ด๊ฑฐ๋‚˜ ์ƒ์–ด์™€ ๊ฐ™๋‹ค๋ฉด ๊ทธ๋ƒฅ ๊ธธ์ด๋ฏ€๋กœ visit ์ฒ˜๋ฆฌ ํ›„ Q์— ๋„ฃ์Œ
            if not mat[si][sj] or mat[si][sj] == k_size:
                Q.append((m_dis+1, si, sj))
            # ํฌ๊ธฐ๊ฐ€ ๋” ์ž‘๋‹ค๋ฉด
            else:
                # min_dis์™€ m_dis+1 ๋น„๊ตํ•ด์„œ ๋” ํฌ๋ฉด ์˜๋ฏธ ์—†์œผ๋ฏ€๋กœ continue
                if min_dis < m_dis+1: continue
                # min_dis์™€ m_dis+1 ๋น„๊ตํ•ด์„œ ๋” ์ž‘์œผ๋ฉด min_dis ๊ฐฑ์‹  ํ›„ ์–˜๊ฐ€ ํƒ€๊ฒŸ
                if min_dis > m_dis+1:
                    min_dis = m_dis+1
                    ti, tj = si, sj
                # ๊ฐ™์œผ๋ฉด ti, tj ๋น„๊ตํ•ด์„œ ๋Œ€์กฐ
                else:
                    ti, tj = sorted([(si, sj), (ti, tj)])[0]

    # ti, tj๊ฐ€ ์ดˆ๊ธฐ๊ฐ’์ด๋ผ๋ฉด ๊ฐ€๋Šฅํ•œ target์ด ์—†์œผ๋ฏ€๋กœ ์ง‘์— ๊ฐ€์•ผ ํ•จ
    if ti==tj==500: return False

    # target ๋จน์œผ๋Ÿฌ ์ด๋™
    time += min_dis
    ki, kj = ti, tj
    mat[ti][tj] = 0
    k_stack += 1
    if k_stack==k_size:
        k_size += 1
        k_stack = 0

    return True


N = int(input())
mat = [list(map(int, input().split())) for _ in range(N)]
k_size = 2
k_stack, ki, kj = 0, 0, 0
find_shark()
time = 0
mat[ki][kj] = 0
while True:
    if not find_target(): break
print(time)

์ ˆ์ฐจ์— ๋”ฐ๋ผ ๊ตฌํ˜„ํ•˜๋ฉด ๋˜๋Š” ๋‹จ์ˆœํ•œ ๊ตฌํ˜„๋ฌธ์ œ์˜€๋‹ค.


๊ฒฐ๊ณผ

๋งž์•˜์Šต๋‹ˆ๋‹ค!!

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ