์•Œ๊ณ ๋ฆฌ์ฆ˜ ๐Ÿ’ก/๋ฐฑ์ค€

๋ฐฑ์ค€ 7576๋ฒˆ ํ† ๋งˆํ†  (BFS ๋ฌธ์ œ) _ ํŒŒ์ด์ฌ

@ENFJ 2025. 2. 18. 19:36
from collections import deque

# ์ž…๋ ฅ ๋ฐ›๊ธฐ
M, N = map(int, input().split())
tomato = [list(map(int, input().split())) for _ in range(N)]

# 4๋ฐฉํ–ฅ(์ƒ, ํ•˜, ์ขŒ, ์šฐ) ์ •์˜
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

# ์ต์€ ํ† ๋งˆํ† ์˜ ์œ„์น˜ ํ์— ๋„ฃ๊ธฐ
queue = deque()

# ์ดˆ๊ธฐ ์ต์€ ํ† ๋งˆํ†  ์œ„์น˜ ์ฐพ๊ธฐ
for i in range(N):
    for j in range(M):
        if tomato[i][j] == 1:  # ์ต์€ ํ† ๋งˆํ† ์ผ ๊ฒฝ์šฐ
            queue.append((i, j))

# BFS ์‹œ์ž‘
def bfs():
    # ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
    while queue:
        x, y = queue.popleft()
        
        # 4๋ฐฉํ–ฅ ํƒ์ƒ‰
        for i in range(4):
            nx, ny = x + dx[i], y + dy[i]
            
            # ๋ฒ”์œ„ ์ฒดํฌ
            if 0 <= nx < N and 0 <= ny < M:
                if tomato[nx][ny] == 0:  # ์•„์ง ์ต์ง€ ์•Š์€ ํ† ๋งˆํ† 
                    tomato[nx][ny] = tomato[x][y] + 1  # 1์ดˆ ์ฆ๊ฐ€์‹œํ‚ค๋ฉด์„œ ์ตํžˆ๊ธฐ
                    queue.append((nx, ny))  # ์ต์€ ํ† ๋งˆํ† ๋ฅผ ํ์— ์ถ”๊ฐ€

# BFS ์‹คํ–‰
bfs()

# ๊ฒฐ๊ณผ ํ™•์ธ: ํ† ๋งˆํ† ๊ฐ€ ๋ชจ๋‘ ์ต์—ˆ๋Š”์ง€ ํ™•์ธ
max_days = 0
for i in range(N):
    for j in range(M):
        if tomato[i][j] == 0:  # ์•„์ง ์ต์ง€ ์•Š์€ ํ† ๋งˆํ† ๊ฐ€ ์žˆ๋‹ค๋ฉด
            print(-1)
            exit(0)
        max_days = max(max_days, tomato[i][j])  # ๊ฐ€์žฅ ํฐ ๊ฐ’(์ตœ๋Œ€ ์ผ์ˆ˜)์„ ๊ตฌํ•จ

# ๋งˆ์ง€๋ง‰์— -1์„ ๋นผ์ค˜์•ผ 0์ดˆ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ ์‹œ๊ฐ„์„ ๋งž์ถœ ์ˆ˜ ์žˆ์Œ
print(max_days - 1)

1๏ธโƒฃ ๋ฌธ์ œ ์ดํ•ดํ•˜๊ธฐ

๐Ÿ”น ๋ฌธ์ œ ์š”์•ฝ

  • ์ฐฝ๊ณ ์— ์ต์€ ํ† ๋งˆํ† (1), ์•ˆ ์ต์€ ํ† ๋งˆํ† (0), ๋นˆ ์นธ(-1) ๊ฐ€ ์žˆ๋‹ค.
  • ์ต์€ ํ† ๋งˆํ† (1)๋Š” ํ•˜๋ฃจ๊ฐ€ ์ง€๋‚˜๋ฉด ์ƒํ•˜์ขŒ์šฐ์˜ ์•ˆ ์ต์€ ํ† ๋งˆํ† (0)๋ฅผ ์ต๊ฒŒ ๋งŒ๋“ ๋‹ค.
  • ๋ชจ๋“  ํ† ๋งˆํ† ๊ฐ€ ์ต๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์ตœ์†Œ ๋‚ ์งœ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ!


    ๐Ÿ”น ์ž…๋ ฅ ์˜ˆ์‹œ
6 4  # ๊ฐ€๋กœ(์—ด) M=6, ์„ธ๋กœ(ํ–‰) N=4
0 0 -1 0 0 0
0 0  1 0 -1 0
0 0 -1 0 0 0
0 0  0 0 -1 1

๐Ÿ”น ์ถœ๋ ฅ ์˜ˆ์‹œ

4  # (๋ชจ๋“  ํ† ๋งˆํ† ๊ฐ€ ์ต๋Š” ๋ฐ ๊ฑธ๋ฆฐ ์ตœ์†Œ ๋‚ ์งœ)

2๏ธโƒฃ BFS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

  • BFS(๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰) ๋Š” ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํƒ์ƒ‰์— ์ ํ•ฉํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด์•ผ.
  • ํ† ๋งˆํ† ๋Š” ๋™์‹œ์— ์—ฌ๋Ÿฌ ๋ฐฉํ–ฅ(์ƒํ•˜์ขŒ์šฐ)์œผ๋กœ ํผ์ ธ๋‚˜๊ฐ€์•ผ ํ•จ → BFS ์‚ฌ์šฉ!
    (DFS๋Š” ํ•œ์ชฝ์œผ๋กœ๋งŒ ๊นŠ๊ฒŒ ํƒ์ƒ‰ํ•ด์„œ ์ ํ•ฉํ•˜์ง€ ์•Š์•„)

3๏ธโƒฃ ๋ฌธ์ œ ํ’€์ด ๊ณผ์ •

โœ… 1๋‹จ๊ณ„: ์ž…๋ ฅ ๋ฐ›๊ธฐ

from collections import deque
import sys

M, N = map(int, sys.stdin.readline().split())  # ๊ฐ€๋กœ(M), ์„ธ๋กœ(N)
tomato = [list(map(int, sys.stdin.readline().split())) for _ in range(N)]

๐Ÿ“Œ ์ด์ฐจ์› ๋ฐฐ์—ด(tomato)๋กœ ์ฐฝ๊ณ  ์ •๋ณด๋ฅผ ์ €์žฅ

 

โœ… 2๋‹จ๊ณ„: BFS๋ฅผ ์œ„ํ•œ ์ค€๋น„ (ํ ์ดˆ๊ธฐํ™”)

queue = deque()

# ์ต์€ ํ† ๋งˆํ† (1)์˜ ์œ„์น˜๋ฅผ ๋ชจ๋‘ ํ์— ์ถ”๊ฐ€
for i in range(N):
    for j in range(M):
        if tomato[i][j] == 1:
            queue.append((i, j))

๐Ÿ“Œ ์ต์€ ํ† ๋งˆํ† (1)๋“ค์˜ ์œ„์น˜๋ฅผ ๋ฏธ๋ฆฌ ํ์— ๋„ฃ์Œ → BFS์—์„œ ๋™์‹œ์— ํผ์ง€๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด!

 

โœ… 3๋‹จ๊ณ„: 4๋ฐฉํ–ฅ ์ด๋™ ์ •์˜

dx = [-1, 1, 0, 0]  # ์ƒ, ํ•˜, ์ขŒ, ์šฐ (ํ–‰ ๋ฐฉํ–ฅ)
dy = [0, 0, -1, 1]  # ์ƒ, ํ•˜, ์ขŒ, ์šฐ (์—ด ๋ฐฉํ–ฅ)

๐Ÿ“Œ ํ˜„์žฌ ์œ„์น˜์—์„œ ์ƒํ•˜์ขŒ์šฐ๋กœ ์ด๋™ํ•  ๋•Œ ์ขŒํ‘œ๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ!

 

โœ… 4๋‹จ๊ณ„: BFS ํƒ์ƒ‰ ์‹œ์ž‘

def bfs():
    while queue:
        x, y = queue.popleft()  # ํ์—์„œ ํ˜„์žฌ ์œ„์น˜ ๊บผ๋ƒ„

        for i in range(4):  # ๋„ค ๋ฐฉํ–ฅ ํƒ์ƒ‰
            nx = x + dx[i]
            ny = y + dy[i]

            # ๋ฒ”์œ„ ์•ˆ์— ์žˆ๊ณ , ์ต์ง€ ์•Š์€ ํ† ๋งˆํ† (0)์ผ ๊ฒฝ์šฐ
            if 0 <= nx < N and 0 <= ny < M and tomato[nx][ny] == 0:
                tomato[nx][ny] = tomato[x][y] + 1  # ํ•˜๋ฃจ ์ถ”๊ฐ€
                queue.append((nx, ny))  # ์ƒˆ๋กœ์šด ์ต์€ ํ† ๋งˆํ†  ์ถ”๊ฐ€

๐Ÿ“Œ ํ์—์„œ ๊บผ๋‚ธ ์ขŒํ‘œ (x, y)์—์„œ ์ƒํ•˜์ขŒ์šฐ๋กœ ํผ์ ธ ๋‚˜๊ฐ
๐Ÿ“Œ ์ต์ง€ ์•Š์€ ํ† ๋งˆํ† (0)๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด ํ•˜๋ฃจ ์ถ”๊ฐ€ (tomato[x][y] + 1)

 

โœ… 5๋‹จ๊ณ„: BFS ์‹คํ–‰ ํ›„ ์ตœ๋Œ€ ๋‚ ์งœ ์ฐพ๊ธฐ

bfs()  # BFS ์‹คํ–‰

max_day = 0  # ๊ฑธ๋ฆฐ ์ตœ๋Œ€ ์ผ์ˆ˜
for row in tomato:
    for t in row:
        if t == 0:  # ์ต์ง€ ์•Š์€ ํ† ๋งˆํ† ๊ฐ€ ๋‚จ์•„์žˆ์œผ๋ฉด
            print(-1)
            exit()
        max_day = max(max_day, t)

print(max_day - 1)  # ์ฒ˜์Œ ์‹œ์ž‘์„ 1๋กœ ํ–ˆ์œผ๋ฏ€๋กœ 1 ๋นผ์คŒ

๐Ÿ“Œ ๋ชจ๋“  ํ† ๋งˆํ† ๊ฐ€ ์ต์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์ตœ๋Œ€ ๋‚ ์งœ ์ถœ๋ ฅ!
๐Ÿ“Œ ํ•˜๋‚˜๋ผ๋„ 0์ด ๋‚จ์•„ ์žˆ์œผ๋ฉด -1 ์ถœ๋ ฅ (์ต์„ ์ˆ˜ ์—†๋Š” ํ† ๋งˆํ†  ์กด์žฌ)
๐Ÿ“Œ ์ฒ˜์Œ ์‹œ์ž‘์„ 1๋กœ ์„ค์ •ํ–ˆ์œผ๋ฏ€๋กœ, ๊ฒฐ๊ณผ์—์„œ 1์„ ๋นผ์คŒ!

4๏ธโƒฃ ์ตœ์ข… ์ฝ”๋“œ

from collections import deque
import sys

# ์ž…๋ ฅ ๋ฐ›๊ธฐ
M, N = map(int, sys.stdin.readline().split())
tomato = [list(map(int, sys.stdin.readline().split())) for _ in range(N)]

# ํ ์ดˆ๊ธฐํ™” (์ต์€ ํ† ๋งˆํ†  ์œ„์น˜ ์ €์žฅ)
queue = deque()
for i in range(N):
    for j in range(M):
        if tomato[i][j] == 1:
            queue.append((i, j))

# ๋„ค ๋ฐฉํ–ฅ ์ด๋™ ์ •์˜ (์ƒ, ํ•˜, ์ขŒ, ์šฐ)
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

# BFS ํƒ์ƒ‰ ํ•จ์ˆ˜
def bfs():
    while queue:
        x, y = queue.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if 0 <= nx < N and 0 <= ny < M and tomato[nx][ny] == 0:
                tomato[nx][ny] = tomato[x][y] + 1
                queue.append((nx, ny))

bfs()  # BFS ์‹คํ–‰

# ๊ฒฐ๊ณผ ๊ณ„์‚ฐ
max_day = 0
for row in tomato:
    for t in row:
        if t == 0:
            print(-1)  # ์ต์ง€ ์•Š์€ ํ† ๋งˆํ† ๊ฐ€ ์žˆ์œผ๋ฉด -1 ์ถœ๋ ฅ
            exit()
        max_day = max(max_day, t)

print(max_day - 1)  # ์ฒ˜์Œ ์‹œ์ž‘์„ 1๋กœ ํ–ˆ์œผ๋ฏ€๋กœ 1 ๋นผ์คŒ

5๏ธโƒฃ ์ตœ์ข… ์ •๋ฆฌ

โœ… BFS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

  • ํ† ๋งˆํ† ๊ฐ€ ๋™์‹œ์— ์ƒํ•˜์ขŒ์šฐ๋กœ ํผ์ ธ์•ผ ํ•ด์„œ BFS๊ฐ€ ์ ํ•ฉ!

โœ… ํ’€์ด ๊ณผ์ •

1๏ธโƒฃ ์ž…๋ ฅ ๋ฐ›๊ธฐ → 2์ฐจ์› ๋ฆฌ์ŠคํŠธ(tomato) ์ƒ์„ฑ
2๏ธโƒฃ ํ ์ดˆ๊ธฐํ™” → ์ต์€ ํ† ๋งˆํ† (1) ์œ„์น˜๋ฅผ ํ์— ๋„ฃ๊ธฐ
3๏ธโƒฃ BFS ํƒ์ƒ‰ → ์ต์€ ํ† ๋งˆํ† ๊ฐ€ ์ƒํ•˜์ขŒ์šฐ๋กœ ํผ์ง
4๏ธโƒฃ ์ตœ๋Œ€ ๋‚ ์งœ ์ฐพ๊ธฐ → ๋ชจ๋“  ํ† ๋งˆํ† ๊ฐ€ ์ต์—ˆ๋Š”์ง€ ํ™•์ธ ํ›„ ์ถœ๋ ฅ