๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜/DFS BFS

[Python] ๋ฐฑ์ค€ 7569 ํ† ๋งˆํ† 

by JayAlex07 2023. 2. 13.

๐Ÿง‘โ€๐Ÿ’ป [Python] ๋ฐฑ์ค€ 7569 ํ† ๋งˆํ† 

Gold 5 - BFS

๋ฌด์กฐ๊ฑด BFS๋กœ ํ’€์–ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค

์‹œ์ž‘์ ์ด ํ•˜๋‚˜๊ฐ€ ์•„๋‹ ์ˆ˜ ์žˆ๋‹ค

  • ๊ทธ๋ž˜์„œ queue ์•ˆ์—๋‹ค ์‹œ์ž‘์ ๋“ค์„ ๋ชจ๋‘ ์ฐพ์•„์„œ ๋„ฃ๋Š”๋‹ค

BFS๋ฅผ ํ• ๋•Œ๋งˆ๋‹ค ์ฃผ๋ณ€ ๋…ธ๋“œ์—๋‹ค ๋ฐฉ๋ฌธ ํ‘œ์‹œ ๋Œ€์‹  1์„ ๋”ํ•ด์„œ, ๋”ํ•œ ์ˆซ์ž๋ฅผ ๋„ฃ๋Š”๋‹ค

๋งˆ์ง€๋ง‰์— ๋‹ค์‹œ ํƒ์ƒ‰์„ ํ•ด์•ผํ•˜๋Š”๋ฐ, 0์ด ํ•˜๋‚˜๋ผ๋„ ์žˆ์œผ๋ฉด -1์„ ์ถœ๋ ฅํ•˜๊ณ , ๊ทธ๊ฒŒ ์•„๋‹ˆ๋ฉด ๋”ํ•œ ์ˆซ์ž๋“ค ์ค‘ ์ œ์ผ ํฐ ์ˆซ์ž์— 1์„ ๋นผ์„œ, ๋‹ต์„ ์ถœ๋ ฅํ•œ๋‹ค

7576๊ณผ ๊ฐ™์€ ๋ฌธ์ œ์ด์ง€๋งŒ, ๋†’์ด๊ฐ€ ์ถ”๊ฐ€๊ฐ€ ๋˜์—ˆ๋‹ค

  • 3์ค‘ ํฌ๋ฌธ์„ ์“ฐ๋˜, 3์ค‘ ๋ฆฌ์ŠคํŠธ ์‚ฌ์šฉ๋ฒ•์„ ์ตํ˜€์•ผ ํ•œ

๋ฌธ์ œํ’€์ด

  • bfs ์‹
    • ์ฃผ๋ณ€์„ ํƒ์ƒ‰ํ•˜๊ณ , ์ฃผ๋ณ€์— ์žˆ๋Š” ๋…ธ๋“œ ์œ„์ฃผ๋กœ ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด popleft๋ฅผ ์‚ฌ์šฉ
  • ์ฒซ for๋ฌธ
    • queue์—๋‹ค๊ฐ€ ์‹œ์ž‘ ์ ๋“ค์„ ๋„ฃ๋Š”๋‹ค
    • ์‹œ์ž‘์ ์ด ํ•˜๋‚˜์ผ ๋•Œ์—๋Š” for๋ฌธ์„ ๋Œ๋ฆด ํ•„์š”๊ฐ€ ์—†์ง€๋งŒ, ์ด ๋ฌธ์ œ์—์„œ๋Š” ์‹œ์ž‘์ ์ด 1๊ฐœ ์ด์ƒ์ด ์ฃผ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค
  • ๋‘๋ฒˆ์งธ for๋ฌธ
    • ๊ฒฐ๊ณผ๊ฐ’์„ ํƒ์ƒ‰ํ•œ๋‹ค
    • bfs๋ฅผ ๋‹ค ๋Œ๊ณ ๋‚˜๋ฉด, box์— ๋ช‡ ์ผ์ด ์ง€๋‚ฌ๋Š”์ง€, ์ˆซ์ž๋“ค์ด ํ‘œ๊ธฐ๋˜์–ด ์žˆ๋‹ค
    • ๊ฐ ์—ด์„ ๋Œ๋ฉฐ, ์—ด์—์„œ ์ œ์ผ ํฐ ์ˆซ์ž๋ฅผ answer์— ์ €์žฅ์„ ํ•œ๋‹ค
    • ๋‹จ, 0์ด ํ•˜๋‚˜๋ผ๋„ ๋ฐœ๊ฒฌ์ด ๋œ๋‹ค๋ฉด, flag๋Š” False๋กœ ๋ฐ”๊พผ๋‹ค
      • ์ด ๋œป์€, ๋ชจ๋“  ํ† ๋งˆํ† ๊ฐ€ ๋‹ค ์ต์ง€ ๋ชป ํ–ˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค
      • ์ฆ‰ -1์„ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค

์ฝ”๋“œ

from collections import deque

def bfs(queue):

    while queue:
        current_h, current_r, current_c = queue.popleft()

        for i in range(6):
            sh, sr, sc = current_h + dh[i], current_r + dr[i], current_c + dc[i]

            if 0 <= sr < N and 0 <= sc < M and 0 <= sh < H:
                if box[sh][sr][sc] == 0 and box[sh][sr][sc] != -1:
                    box[sh][sr][sc] = box[current_h][current_r][current_c] + 1
                    queue.append((sh, sr, sc))

M, N, H = map(int, input().split())

box = [[list(map(int, input().split())) for _ in range(N)] for _ in range(H)]

queue = deque([])

# ๋ถ์„œ๋™๋‚จ, ์œ„ ์•„๋ž˜
dh, dr, dc= [0, 0, 0, 0, -1, 1], [-1, 0, 0, 1, 0, 0], [0, -1, 1, 0, 0, 0]

answer = 0

# queue์—๋‹ค ์‹œ์ž‘ ์ ๋“ค ๋„ฃ๊ธฐ
for h in range(H):
    for r in range(N):
        for c in range(M):
            if box[h][r][c] == 1:
                queue.append((h, r, c))

bfs(queue)

flag = True
for h in range(H):
    if flag == False:
        break
    for r in range(N):
        if flag == False:
            break
        for c in range(M):
            if box[h][r][c] == 0:
                flag = False
                break

        answer = max(answer, max(box[h][r]))

if flag == False:
    print(-1)
else:
    print(answer -1)