[Python - λ°±μ€€ 7576] ν† λ§ˆν† 

2021. 1. 17. 03:45γ†πŸ“š Algorithm/πŸ’ͺ🏻 Python 문제 풀이

λ°˜μ‘ν˜•
 

7576번: ν† λ§ˆν† 

첫 μ€„μ—λŠ” μƒμžμ˜ 크기λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 두 μ •μˆ˜ M,N이 주어진닀. M은 μƒμžμ˜ κ°€λ‘œ 칸의 수, N은 μƒμžμ˜ μ„Έλ‘œ 칸의 수λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. 단, 2 ≤ M,N ≤ 1,000 이닀. λ‘˜μ§Έ μ€„λΆ€ν„°λŠ” ν•˜λ‚˜μ˜ μƒμžμ— μ €μž₯된 ν† λ§ˆν† 

www.acmicpc.net

문제 μ„€λͺ…

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

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

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

μž…λ ₯ν˜•μ‹

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

ν† λ§ˆν† κ°€ ν•˜λ‚˜ 이상 μžˆλŠ” 경우만 μž…λ ₯으둜 주어진닀.

좜λ ₯ν˜•μ‹

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

μž…μΆœλ ₯ μ˜ˆμ‹œ

풀이 κ³Όμ •

기쑴에 ν’€μ—ˆλ˜ BFS λ¬Έμ œμ—μ„œ μ•½κ°„μ˜ μ‘μš©μ΄ ν¬ν•¨λœ λ¬Έμ œμ˜€λ‹€. μ›μ†Œ ν•˜λ‚˜μ”©μ„ κΊΌλ‚΄μ–΄ bfsλ₯Ό κ²€μ‚¬ν•˜λŠ” 것이 μ•„λ‹Œ bfs μ „ tomato 쀑 '1'을 가지고 μžˆλŠ” 것듀을 queue에 λ„£μ–΄μ„œ bfsλ₯Ό μ‹€ν–‰ν•΄μ€˜μ•Ό ν•˜λ©°, ν† λ§ˆν† κ°€ λͺ¨λ‘ μ΅λŠ” λ‚ μ§œλ₯Ό ν”„λ¦°νŠΈ ν•΄μ£ΌκΈ° μœ„ν•΄ queue에 count+1도 더해 μ€˜μ•Ό ν–ˆλ‹€. 

+ κΈ°μ‘΄ bfs 방식은 λ™μΌν•˜λ‚˜ λ‚˜μ€‘μ— λͺ¨λ“  ν† λ§ˆν† λ₯Ό λ°©λ¬Έν–ˆμ„ λ•Œ, 읡힐수 μ—†λŠ” ν† λ§ˆν† κ°€ μ‘΄μž¬ν•˜λŠ” 것을 check ν•¨μˆ˜λ₯Ό 톡해 ν™•μΈν•΄μ•Όν•˜λ―€λ‘œ tomato 쀑 -1의 값을 κ°–λŠ” 것은 check = True둜 λ³€κ²½ν•΄μ£Όκ³  μ‹œμž‘ν•΄μ•Όν•œλ‹€.

+ bfs λ₯Ό 톡해 queue에 append ν• λ•ŒλŠ” μΌμˆ˜κ°€ ν•˜λ£¨ μ¦κ°€ν•΄μ•Όν•˜λ―€λ‘œ answer +1 ν•΄μ£ΌλŠ” 것도 μ€‘μš”ν•œ ν¬μΈνŠΈμ΄λ‹€.

 

from collections import deque
import sys


def bfs(queue):
    dxy = [(-1, 0), (1, 0), (0, 1), (0, -1)]
    while queue:
        item = queue.popleft()
        answer = item[2]
        check[item[0]][item[1]] = True
        for dx, dy in dxy:
            new_x = int(dx) + int(item[0])
            new_y = int(dy) + int(item[1])
            if 0 <= new_x < m and 0 <= new_y < n and not check[new_x][new_y]:
                if tomato[new_x][new_y] == 0:
                    check[new_x][new_y] = True
                    queue.append([new_x, new_y, answer + 1])
    return answer


if __name__ == '__main__':
    n, m = map(int, sys.stdin.readline().split())
    check = [[False for _ in range(n)] for _ in range(m)]
    tomato = []
    answer = 0
    queue = deque()
    for _ in range(m):
        tomato.append(list(map(int, sys.stdin.readline().split())))

    for row in range(m):
        for col in range(n):
            if tomato[row][col] == 1:
                queue.append([row, col, answer])
            elif tomato[row][col] == -1:
                check[row][col] = True
    answer = bfs(queue)
    for row in range(m):
        for col in range(n):
            if not check[row][col]:
                answer = -1

    print(answer)

 

 

 

λ°˜μ‘ν˜•