ν† λ§ˆν† 

πŸ“„ 문제

문제

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

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

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

μž…λ ₯

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

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

좜λ ₯

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

🧞 풀이

더보기

풀이

# [파이썬] λ°±μ€€ 7576번 문제: ν† λ§ˆν† 

import sys                                                          # sys 뢈러였기
from collections import deque                                       # deque 뢈러였기

m, n = map(int, input().split())                                    # m, n μž…λ ₯ 및 ν• λ‹Ή
storage = [list(map(int,input().split())) for _ in range(n)]        # ν† λ§ˆν†  μ°½κ³  μž…λ ₯ 및 ν• λ‹Ή

dx = [1, -1, 0, 0]                                                  # x 이동 μ’Œν‘œ
dy = [0, 0, 1, -1]                                                  # y 이동 μ’Œν‘œ

q = deque()                                                         # 빈 queue ν• λ‹Ή
dis = [[0] * m for _ in range(n)]                                   # 거리λ₯Ό λ‹΄κΈ° μœ„ν•œ dis λ°°μ—΄ ν• λ‹Ή

check1 = 0                                                          # μ•ˆ 읡은 ν† λ§ˆν† κ°€ μ—†λŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•œ check1 ν• λ‹Ή
for c1 in storage:                                                  # storage의 각 ν–‰λ§ˆλ‹€
    if 0 not in c1:                                                 # μ•ˆ 읡은 ν† λ§ˆν† κ°€ μ—†λ‹€λ©΄ (0)
        check1 += 1                                                 # check1 1μ”© 증가
if check1 == n:                                                     # check1κ³Ό n의 크기가 κ°™λ‹€λ©΄
    print(0)                                                        # 0 좜λ ₯
    sys.exit()                                                      # 싀행쀑인 슀크립트 μ’…λ£Œ

for j in range(n):
    for i in range(m):
        if storage[j][i] == 1:                                      # 읡은 ν† λ§ˆν† λΌλ©΄ (1)
            q.append((i, j))                                        # 읡은 ν† λ§ˆν† μ˜ μ’Œν‘œ queue에 μΆ”κ°€

while q:                                                            # q의 μš”μ†Œκ°€ μžˆλŠ” 경우 계속 반볡
    x, y = q.popleft()                                              # q μš”μ†Œ κΊΌλ‚΄μ„œ x, y에 ν• λ‹Ή
    for k in range(4):
        nx = dx[k] + x
        ny = dy[k] + y
        if 0 <= nx < m and 0 <= ny < n and storage[ny][nx] == 0:    # λ²”μœ„ 내에 μžˆμœΌλ©΄μ„œ, μ•ˆ 읡은 ν† λ§ˆν† μΌ 경우 (0)
            storage[ny][nx] = 1                                     # 읡은 ν† λ§ˆν† λ‘œ λ³€κ²½
            q.append((nx, ny))                                      # ν•΄λ‹Ή μ’Œν‘œ queue에 μΆ”κ°€
            dis[ny][nx] = dis[y][x] + 1                             # ν† λ§ˆν† κ°€ 읡은 λ‚ μ§œ λ„£κΈ°

ans = 0                                                             # λ‚ μ§œλ₯Ό 담을 ans ν• λ‹Ή

for c2 in storage:                                                  # storage 각 ν–‰λ§ˆλ‹€ 탐색
    if 0 in c2:                                                     # μ•ˆ 읡은 ν† λ§ˆν† κ°€ 아직 μžˆλ‹€λ©΄
        print(-1)                                                   # -1 좜λ ₯
        sys.exit(0)                                                 # 슀크립트 μ‹€ν–‰ μ’…λ£Œ

for l1 in range(n):
    for l2 in range(m):
        if dis[l1][l2] > ans:
            ans = dis[l1][l2]                                       # μ΅œλŒ“κ°’ ν• λ‹Ή

print(ans)                                                          # ans 좜λ ₯

+ Recent posts