πŸ“š Study/Baekjoon

[Gold V] 7576 - ν† λ§ˆν† 

윰갱 2025. 4. 19. 01:03

문제

 

철수의 ν† λ§ˆν†  농μž₯μ—μ„œλŠ” ν† λ§ˆν† λ₯Ό λ³΄κ΄€ν•˜λŠ” 큰 μ°½κ³ λ₯Ό κ°€μ§€κ³  μžˆλ‹€. ν† λ§ˆν† λŠ” μ•„λž˜μ˜ κ·Έλ¦Όκ³Ό 같이 격자 λͺ¨μ–‘ μƒμžμ˜ 칸에 ν•˜λ‚˜μ”© λ„£μ–΄μ„œ 창고에 λ³΄κ΄€ν•œλ‹€.

창고에 λ³΄κ΄€λ˜λŠ” ν† λ§ˆν† λ“€ μ€‘μ—λŠ” 잘 읡은 것도 μžˆμ§€λ§Œ, 아직 읡지 μ•Šμ€ ν† λ§ˆν† λ“€λ„ μžˆμ„ 수 μžˆλ‹€. 보관 ν›„ ν•˜λ£¨κ°€ μ§€λ‚˜λ©΄, 읡은 ν† λ§ˆν† λ“€μ˜ μΈμ ‘ν•œ 곳에 μžˆλŠ” 읡지 μ•Šμ€ ν† λ§ˆν† λ“€μ€ 읡은 ν† λ§ˆν† μ˜ 영ν–₯을 λ°›μ•„ 읡게 λœλ‹€. ν•˜λ‚˜μ˜ ν† λ§ˆν† μ˜ μΈμ ‘ν•œ 곳은 μ™Όμͺ½, 였λ₯Έμͺ½, μ•ž, λ’€ λ„€ λ°©ν–₯에 μžˆλŠ” ν† λ§ˆν† λ₯Ό μ˜λ―Έν•œλ‹€. λŒ€κ°μ„  λ°©ν–₯에 μžˆλŠ” ν† λ§ˆν† λ“€μ—κ²ŒλŠ” 영ν–₯을 μ£Όμ§€ λͺ»ν•˜λ©°, ν† λ§ˆν† κ°€ 혼자 μ €μ ˆλ‘œ μ΅λŠ” κ²½μš°λŠ” μ—†λ‹€κ³  κ°€μ •ν•œλ‹€. μ² μˆ˜λŠ” 창고에 λ³΄κ΄€λœ ν† λ§ˆν† λ“€μ΄ 며칠이 μ§€λ‚˜λ©΄ λ‹€ 읡게 λ˜λŠ”μ§€, κ·Έ μ΅œμ†Œ 일수λ₯Ό μ•Œκ³  μ‹Άμ–΄ ν•œλ‹€.

ν† λ§ˆν† λ₯Ό 창고에 λ³΄κ΄€ν•˜λŠ” 격자λͺ¨μ–‘μ˜ μƒμžλ“€μ˜ 크기와 읡은 ν† λ§ˆν† λ“€κ³Ό 읡지 μ•Šμ€ ν† λ§ˆν† λ“€μ˜ 정보가 μ£Όμ–΄μ‘Œμ„ λ•Œ, 며칠이 μ§€λ‚˜λ©΄ ν† λ§ˆν† λ“€μ΄ λͺ¨λ‘ μ΅λŠ”μ§€, κ·Έ μ΅œμ†Œ 일수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ. 단, μƒμžμ˜ 일뢀 μΉΈμ—λŠ” ν† λ§ˆν† κ°€ λ“€μ–΄μžˆμ§€ μ•Šμ„ μˆ˜λ„ μžˆλ‹€.

μž…λ ₯

첫 μ€„μ—λŠ” μƒμžμ˜ 크기λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 두 μ •μˆ˜ M,N이 μ£Όμ–΄μ§„λ‹€. M은 μƒμžμ˜ κ°€λ‘œ 칸의 수, N은 μƒμžμ˜ μ„Έλ‘œ 칸의 수λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. 단, 2 ≤ M,N ≤ 1,000 이닀. λ‘˜μ§Έ μ€„λΆ€ν„°λŠ” ν•˜λ‚˜μ˜ μƒμžμ— μ €μž₯된 ν† λ§ˆν† λ“€μ˜ 정보가 μ£Όμ–΄μ§„λ‹€. 즉, λ‘˜μ§Έ 쀄뢀터 N개의 μ€„μ—λŠ” μƒμžμ— λ‹΄κΈ΄ ν† λ§ˆν† μ˜ 정보가 μ£Όμ–΄μ§„λ‹€. ν•˜λ‚˜μ˜ μ€„μ—λŠ” μƒμž κ°€λ‘œμ€„μ— λ“€μ–΄μžˆλŠ” ν† λ§ˆν† μ˜ μƒνƒœκ°€ M개의 μ •μˆ˜λ‘œ μ£Όμ–΄μ§„λ‹€. μ •μˆ˜ 1은 읡은 ν† λ§ˆν† , μ •μˆ˜ 0은 읡지 μ•Šμ€ ν† λ§ˆν† , μ •μˆ˜ -1은 ν† λ§ˆν† κ°€ λ“€μ–΄μžˆμ§€ μ•Šμ€ 칸을 λ‚˜νƒ€λ‚Έλ‹€.

ν† λ§ˆν† κ°€ ν•˜λ‚˜ 이상 μžˆλŠ” 경우만 μž…λ ₯으둜 μ£Όμ–΄μ§„λ‹€.

좜λ ₯

μ—¬λŸ¬λΆ„μ€ ν† λ§ˆν† κ°€ λͺ¨λ‘ 읡을 λ•ŒκΉŒμ§€μ˜ μ΅œμ†Œ λ‚ μ§œλ₯Ό 좜λ ₯ν•΄μ•Ό ν•œλ‹€. λ§Œμ•½, μ €μž₯될 λ•ŒλΆ€ν„° λͺ¨λ“  ν† λ§ˆν† κ°€ μ΅μ–΄μžˆλŠ” μƒνƒœμ΄λ©΄ 0을 좜λ ₯ν•΄μ•Ό ν•˜κ³ , ν† λ§ˆν† κ°€ λͺ¨λ‘ μ΅μ§€λŠ” λͺ»ν•˜λŠ” 상황이면 -1을 좜λ ₯ν•΄μ•Ό ν•œλ‹€.

예제 μž…λ ₯ 1 λ³΅μ‚¬

6 4
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 1

예제 좜λ ₯ 1 λ³΅μ‚¬

8

예제 μž…λ ₯ 2 λ³΅μ‚¬

6 4
0 -1 0 0 0 0
-1 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 1

예제 좜λ ₯ 2 λ³΅μ‚¬

-1

예제 μž…λ ₯ 3 λ³΅μ‚¬

6 4
1 -1 0 0 0 0
0 -1 0 0 0 0
0 0 0 0 -1 0
0 0 0 0 -1 1

예제 좜λ ₯ 3 λ³΅μ‚¬

6

예제 μž…λ ₯ 4 λ³΅μ‚¬

5 5
-1 1 0 0 0
0 -1 -1 -1 0
0 -1 -1 -1 0
0 -1 -1 -1 0
0 0 0 0 0

예제 좜λ ₯ 4 λ³΅μ‚¬

14

예제 μž…λ ₯ 5 λ³΅μ‚¬

2 2
1 -1
-1 1

예제 좜λ ₯ 5 λ³΅μ‚¬

0

# 풀이 방법

μ΅œμ†Œ 일수λ₯Ό κ΅¬ν•œλ‹€ = λ‹€μ‹œ 말해 κ·Έλž˜ν”„μ˜ 깊이λ₯Ό κ΅¬ν•˜λŠ” 것

bfs둜 μ ‘κ·Όν•˜κΈ°λ‘œ λ‹€μ§ν–ˆλ‹€.

κ·Έλž˜ν”„μ˜ 깊이λ₯Ό ꡬ할 λ•ŒλŠ” cnt λ³€μˆ˜λ₯Ό μ¨μ„œ +1을 ν•˜λŠ” 것을 이전에 ν–ˆκΈ° 떄문에 κ΅¬ν˜„μ—μ„œ 큰 어렀움은 μ—†μ—ˆλ‹€

 

all() ν•¨μˆ˜λ₯Ό μ •μ˜ν•΄μ„œ ν˜Ήμ‹œ μ‹œκ°„μ΄ˆκ³Όκ°€ λ‚˜μ§€ μ•Šμ„κΉŒ κ±±μ •ν–ˆλŠ”λ° λ‹€ν–‰νžˆ ν†΅κ³Όλ˜μ—ˆλ‹€.


# μ½”λ“œ

# 2025-04-19 00:22-50
import sys
from collections import deque
sys.stdin = open("input.txt","r")

M, N = map(int, sys.stdin.readline().split())
graph = [list(map(int, sys.stdin.readline().split())) for _ in range(N)]

queue = deque()
for i in range(N):
    for j in range(M):
        if graph[i][j] == 1:
            queue.append((i,j,0))

# μƒν•˜μ’Œμš°
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

def all():
    for i in range(N):
        for j in range(M):
            if graph[i][j] == 0:
                return False
    return True

def bfs():
    cnt = 0
    while queue:
        x, y, cnt = queue.popleft()

        for i in range(4):
            nx, ny = x + dx[i], y + dy[i]
            if 0 <= nx < N and 0 <= ny < M:
                if graph[nx][ny] == 0:
                    graph[nx][ny] = 1
                    queue.append((nx,ny,cnt+1))
    return cnt


if all(): print(0) # μ €μž₯될 λ•ŒλΆ€ν„° λͺ¨λ“  ν† λ§ˆν† κ°€ μ΅μ–΄μžˆλŠ” μƒνƒœ
else:
    cnt = bfs()
    if all(): print(cnt) # ν† λ§ˆν† κ°€ λͺ¨λ‘ 읡을 λ•ŒκΉŒμ§€μ˜ μ΅œμ†Œ λ‚ μ§œλ₯Ό 좜λ ₯
    else: print(-1) # ν† λ§ˆν† κ°€ λͺ¨λ‘ μ΅μ§€λŠ” λͺ»ν•˜λŠ” 상황

# μ°Έκ³  (λŸ°νƒ€μž„ 였λ₯˜ ν•΄κ²°)

λŸ°νƒ€μž„ μ—λŸ¬ (UnboundLocalError)κ°€  λ–΄λ‹€.

κ·Έ μ΄μœ λŠ”, while queue 루프가 단 ν•œ λ²ˆλ„ μ‹€ν–‰λ˜μ§€ μ•ŠμœΌλ©΄, cntλŠ” μ •μ˜λ˜μ§€ μ•Šμ€ μ±„λ‘œ return cntκ°€ 되기 떄문이닀.

λ”°λΌμ„œ cntλ₯Ό ν•¨μˆ˜ μ‹œμž‘μ‹œ κΈ°λ³Έκ°’μœΌλ‘œ μ΄ˆκΈ°ν™”ν•΄μ€˜μ•Ό ν•œλ‹€.

# 2025-04-19 00:22- 
import sys
from collections import deque
# sys.stdin = open("input.txt","r")

M, N = map(int, sys.stdin.readline().split())
graph = [list(map(int, sys.stdin.readline().split())) for _ in range(N)]

queue = deque()
for i in range(N):
    for j in range(M):
        if graph[i][j] == 1:
            queue.append((i,j,0))

# μƒν•˜μ’Œμš°
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

def all():
    for i in range(N):
        for j in range(M):
            if graph[i][j] == 0:
                return False
    return True

def bfs():
    while queue:
        x, y, cnt = queue.popleft()

        for i in range(4):
            nx, ny = x + dx[i], y + dy[i]
            if 0 <= nx < N and 0 <= ny < M:
                if graph[nx][ny] == 0:
                    graph[nx][ny] = 1
                    queue.append((nx,ny,cnt+1))
    return cnt


if all(): print(0)
else:
    cnt = bfs()
    if all(): print(cnt)
    else: print(-1)