πŸ’» Algorithm/Python

[Python] λ°±μ€€ 7576 ν† λ§ˆν†  (BFS)

μ„ μ£Ό 2022. 7. 8. 23:32

πŸ“Œ 문제

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

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

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

μž…λ ₯

첫 μ€„μ—λŠ” μƒμžμ˜ 크기λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 두 μ •μˆ˜ 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

 


πŸ“Œ 풀이

πŸ’¬ Code

import sys
from collections import deque
input = sys.stdin.readline

m, n = map(int, input().split())
box = []
tomato = []
for i in range(n):
    box.append(list(map(int, input().split())))
    for j in range(m):
        if box[i][j] == 1:
            tomato.append((0, i, j))

dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

q = deque(tomato)
while q:
    day, x, y = q.popleft()
    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]
        if 0 <= nx < n and 0 <= ny < m and box[nx][ny] == 0:
            box[nx][ny] = 1
            q.append((day+1, nx, ny))

for i in range(n):
    if 0 in box[i]:
        print(-1)
        sys.exit(0)

print(day)

πŸ’‘ Solution

m, n = map(int, input().split())
box = []
tomato = []
for i in range(n):
    box.append(list(map(int, input().split())))
    for j in range(m):
        if box[i][j] == 1:
            tomato.append((0, i, j))
  • box: 각 μƒμžμ˜ ν† λ§ˆν†  μƒνƒœλ₯Ό μ €μž₯ν•˜λŠ” 2차원 리슀트
  • tomato: 읡은 ν† λ§ˆν† κ°€ μžˆλŠ” μœ„μΉ˜λ₯Ό μ €μž₯ν•˜λŠ” 리슀트. 0은 이 ν† λ§ˆν† κ°€ 읡은 λ‚ μ§œλ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

q = deque(tomato)
while q:
    day, x, y = q.popleft()
    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]
        if 0 <= nx < n and 0 <= ny < m and box[nx][ny] == 0:
            box[nx][ny] = 1
            q.append((day+1, nx, ny))

μ΅λ§ˆν† κ°€ μžˆλŠ” μœ„μΉ˜μ˜ 근처만 μ‚΄νŽ΄λ³΄κΈ° μœ„ν•΄μ„œ 덱에 tomatoλ₯Ό λ‹΄μ•˜μŠ΅λ‹ˆλ‹€.

 

(nx, ny)λŠ” μ΅λ§ˆν† μ˜ μœ„μΉ˜μΈ (x, y)λ‘œλΆ€ν„° 상/ν•˜/쒌/우둜 μ΄λ™ν•œ μœ„μΉ˜λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. 이 μ΄λ™μœ„μΉ˜μ— λœλ§ˆν† κ°€ μžˆλ‹€λ©΄ 읡도둝 λ°”κΏ”μ€λ‹ˆλ‹€. 이 λœλ§ˆν† κ°€ 읡은 λ‚ μ§œλŠ” μ΅λ§ˆν† κ°€ 읡은 λ‚ μ§œμ˜ λ‹€μŒ λ‚ μ΄λ―€λ‘œ 덱에 day+1을 λ„£μ–΄μ€λ‹ˆλ‹€.

 

μ ‘κ·Ό κ°€λŠ₯ν•œ λœλ§ˆν† λ₯Ό λ‹€ μ΅ν˜€μ€¬λ‹€λ©΄ ifλ¬Έμ—λŠ” λ“€μ–΄κ°ˆ 일이 μ—†μ–΄μ§‘λ‹ˆλ‹€. λ•Œλ¬Έμ— dayκ°€ λ°”λ€” 일이 μ—†κ³ , λ‹Ήμ—°νžˆ μ΅œμ’…μ μœΌλ‘œ dayμ—λŠ” ν† λ§ˆν† κ°€ λͺ¨λ‘ 읡게 된 λ‚ μ§œκ°€ μ €μž₯λ˜λ―€λ‘œ print(day)ν•΄μ£Όλ©΄ μ •λ‹΅μ²˜λ¦¬λ₯Ό 받을 수 μžˆμŠ΅λ‹ˆλ‹€.

for i in range(n):
    if 0 in box[i]:
        print(-1)
        sys.exit(0)

print(day)

단! ν† λ§ˆν† κ°€ λͺ¨λ‘ 읡지 λͺ»ν•˜λŠ” 상황엔 좜λ ₯을 λ‹€λ₯΄κ²Œ ν•΄μ€˜μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— boxλ₯Ό λŒλ©΄μ„œ λœλ§ˆν† κ°€ μ‘΄μž¬ν•˜λ©΄ -1을 좜λ ₯ν•˜κ³  μ’…λ£Œμ‹œν‚΅λ‹ˆλ‹€.