Algorithm

[λ°±μ€€] 7576. ν† λ§ˆν†  python

🐳 링크

λ°±μ€€ 7576번 ν† λ§ˆν† 

πŸ• 문제

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

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

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

μ •μˆ˜ 1은 읡은 ν† λ§ˆν† , μ •μˆ˜ 0은 읡지 μ•Šμ€ ν† λ§ˆν† , μ •μˆ˜ -1은 ν† λ§ˆν† κ°€ λ“€μ–΄μžˆμ§€ μ•Šμ€ 칸을 λ‚˜νƒ€λ‚Έλ‹€.

🐾 풀이 방법

  • ν† λ§ˆν† κ°€ μžˆλ‹€λ©΄, κ·Έ μœ„μΉ˜λ₯Ό 큐에 λ„£μ–΄μ€€λ‹€.
  • 큐가 빌 λ•Œ κΉŒμ§€ while문을 λŒλ¦°λ‹€.
    큐의 μ‚¬μ΄μ¦ˆλ§ŒνΌ for문을 λŒλ¦°λ‹€.
    μƒν•˜μ’Œμš°λ‘œ μ΄λ™ν•΄μ„œ μ•ˆμ΅μ€ ν† λ§ˆν† κ°€ μžˆλ‹€λ©΄ 읡은 ν† λ§ˆν† λ‘œ λ°”κΎΈμ–΄μ€€λ‹€.
    읡은 ν† λ§ˆν† λ‘œ 바뀐 μœ„μΉ˜λ₯Ό 큐에 λ‹€μ‹œ λ„£μ–΄μ€€λ‹€.
  • while문이 λλ‚˜κ³  λ‚˜μ™”μ„ λ•Œ, ν† λ§ˆν† μ— μ•ˆμ΅μ€ ν† λ§ˆν† κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ while 문을 돌린 횟수 즉, daysλ₯Ό λ¦¬ν„΄ν•˜κ³  μ•„λ‹ˆλ©΄ -1을 λ¦¬ν„΄ν•œλ‹€.

solution μ½”λ“œ

  1. bfs이용, μ •λ‹΅μ½”λ“œ
    import sys
    import copy
    from collections import deque
    sys.setrecursionlimit(10**9)
    sys.stdin = open("input.txt","rt")
    dx = [1,-1,0,0]
    dy = [0,0,1,-1]
    
    

def bfs(tomatoes):
days = -1
while farm: #μ΅μ§€μ•Šμ€ ν† λ§ˆν† κ°€ μ‘΄μž¬ν•˜λŠ” λ™μ•ˆ
days += 1
for _ in range(len(farm)):
x, y = farm.popleft()

        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]

            if 0<= nx < n and 0 <= ny < m and tomatoes[nx][ny] == 0:
                tomatoes[nx][ny] = tomatoes[x][y] + 1
                farm.append((nx,ny))
for tomato in tomatoes:
    if 0 in tomato:
        return -1
return days

m,n = map(int,sys.stdin.readline().split())
tomatoes = list()
for _ in range(n):
tomatoes.append(list(map(int,sys.stdin.readline().split())))

farm = deque()

for i in range(n):
for j in range(m):
if tomatoes[i][j] == 1:
farm.append((i,j)) #farm에 읡은 ν† λ§ˆν† μ˜ μœ„μΉ˜λ₯Ό λ„£μ–΄μ€€λ‹€.

print(bfs(tomatoes))


2. ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€λ§Œ 맞고 μ‹œκ°„μ΄ˆκ³Όλ‚˜λŠ” μ½”λ“œ
```python3
import sys
import copy
sys.setrecursionlimit(10**9)
sys.stdin = open("input.txt","rt")
dx = [1,-1,0,0]
dy = [0,0,1,-1]

def isNear(i,j):
    global after
    for _ in range(4):
        x = i + dx[_]
        y = j + dy[_]
        if 0 <= x < n and 0 <= y < m and tomatoes[x][y] == 1:
            after[i][j] = 1
            return

m,n = map(int,sys.stdin.readline().split())
tomatoes = list()
for _ in range(n):
    tomatoes.append(list(map(int,sys.stdin.readline().split())))


days = 0
after = copy.deepcopy(tomatoes)

while True:
    days += 1
    for i in range(n):
        for j in range(m):
            if tomatoes[i][j] == 0:
                isNear(i,j)

    if tomatoes == after:
        chk = False
        for k in range(n):
            if 0 in tomatoes[k]:
                chk = True
                break
        if chk: days = -1
        else:
            days -= 1
        break
    tomatoes = copy.deepcopy(after)

sys.stdout.write(str(days))