๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm/๋ฐฑ์ค€(BOJ)

[ ํŒŒ์ด์ฌ(python) ] ๋ฐฑ์ค€ 7576 - ํ† ๋งˆํ† (BFS)

by YWTechIT 2021. 4. 20.
728x90

๐Ÿ“Œ ๋ฐฑ์ค€ 7576 - ํ† ๋งˆํ† 

๋ฌธ์ œ ์„ค๋ช…


๐Ÿ’ก ๋‚˜์˜ ํ’€์ด

๋‚˜์˜ ์ˆ˜์ค€์—์„œ๋Š” ์–ด๋ ค์› ๋‹ค... ์ต์€ ํ† ๋งˆํ† ๊ฐ€ 1๊ฐœ์ผ ๊ฒฝ์šฐ์—๋Š” ์ž˜ ๊ตฌํ•  ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ, 2๊ฐœ ์ด์ƒ์ธ ๊ฒฝ์šฐ๋Š” ๋„์ €ํžˆ ์ƒ๊ฐ์ด ๋‚˜์ง€ ์•Š์•˜๋‹ค.

 

๊ทธ๋ž˜์„œ ๋‹ค๋ฅธ์‚ฌ๋žŒ์˜ ์ฝ”๋“œ๋ฅผ ์กฐ๊ธˆ ์ฐธ๊ณ ํ–ˆ๋Š”๋ฐ BFS๋ฅผ ๋™์‹œ์— 2๊ฐœ๋ฅผ ๋Œ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์€ ์•„์˜ˆ ์ƒ๊ฐ๋„ ๋ชปํ–ˆ๊ณ  ๊ทธ๋Ÿฌ๋‹ค ๋ณด๋‹ˆ๊นŒ ํ•จ์ˆ˜์˜ ์ฝ”๋“œ๋„ ์ด์ „์— ํ’€๋˜ ๋ฐฉ๋ฒ•๊ณผ๋Š” ์กฐ๊ธˆ ๋‹ฌ๋ผ์„œ ๊ณ ๋ฏผํ•˜๋ฉฐ ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š๋ผ ๋ฐ˜๋‚˜์ ˆ์„ ์Ÿ์•„๋ฒ„๋ ธ๋‹ค.

 

์ฒ˜์Œ์— ์ต์€ ํ† ๋งˆํ† ๊ฐ€ 2๊ฐœ ์ด์ƒ ์žˆ์„ ๋•Œ ์ผ€์ด์Šค๋ฅผ ํ•˜๋‚˜์”ฉ ๋”ํ•ด์„œ ๋‘ ๊ฐœ๋ฅผ ๋”ํ•ด์ฃผ๋ฉด ๋  ์ค„ ์•Œ์•˜๋‹ค. ์ปดํ“จํŒ…์ ์œผ๋กœ ์ƒ๊ฐํ•˜์ง€ ์•Š๊ณ  ๋‚ดํ‚ค๋Š” ๋Œ€๋กœ ์ƒ๊ฐํ•ด๋ฒ„๋ ค์„œ ์•ˆ ๋˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ ค๋‹ˆ๊นŒ ๋จธ๋ฆฌ๊ฐ€ ๊ผฌ์—ฌ๋ฒ„๋ ธ๋‹ค.

 

 

๊ทธ๋ฆฌ๊ณ  ๋ฌธ์ œ ๋งˆ์ง€๋ง‰์— ๋ชจ๋“  ํ† ๋งˆํ† ๊ฐ€ ์ต์–ด์žˆ๋Š” ์ƒํƒœ๋ฅผ 0์œผ๋กœ ์ถœ๋ ฅํ•ด์•ผํ•˜๋Š”๋ฐ, ์ด ๊ฒฝ์šฐ๋Š” ์ œ์™ธํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด 2๊ฐ€์ง€๋งŒ ๊ณ ๋ คํ–ˆ๋‹ค.

 

  1. ํ† ๋งˆํ† ๋ฅผ ๋ชจ๋‘ ์ตํžˆ์ง€ ๋ชปํ–ˆ์„ ๊ฒฝ์šฐ(BFS๋ฅผ ๋Œ๋ฆฌ๊ณ  ๋‚˜์˜จ ๊ฐ’์— 0์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ)
  2. ๋ชจ๋“  ํ† ๋งˆํ† ๊ฐ€ ์ต์€๊ฒฝ์šฐ or ํ† ๋งˆํ† ๊ฐ€ ๋ชจ๋‘ ์ต์„ ๋•Œ๊นŒ์ง€์˜ ์ตœ์†Œ ๋‚ ์งœ
728x90

ํ’€์ด ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

  1. queue๋ฅผ ํ•จ์ˆ˜ ๋ฐ–์— ์„ ์–ธํ•œ๋‹ค.
  2. ๋ชจ๋“  ์ขŒํ‘œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์ต์€ ํ† ๋งˆํ† (1)์˜ ์ขŒํ‘œ๋งŒ queue์—๋‹ค ์ง‘์–ด ๋„ฃ๋Š”๋‹ค.
  3. BFS ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค. (์ด์ „๊ณผ ๋™์ผ: ์ƒ, ํ•˜, ์ขŒ, ์šฐ ์„ ์–ธ -> ํ˜„์žฌ ๋“ค๋ฅด์ง€ ์•Š์€ ์ขŒํ‘œ ๋“ค๋ฅด๊ธฐ -> ์ด์ „ ์ขŒํ‘œ์— +1์”ฉ ๋ˆ„์ ์‹œํ‚ค๊ธฐ)
  4. BFS ์‹คํ–‰
  5. ์‹คํ–‰ํ•˜๊ณ  ๋‚˜์˜จ 2์ฐจ์› ๋ฐฐ์—ด ์ค‘ 0์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด -1 ์ถœ๋ ฅ ์•„๋‹ˆ๋ฉด 2์ฐจ์› ๋ฐฐ์—ด์˜ ์ตœ๋Œ“๊ฐ’์—์„œ -1 ํ•ด์ฃผ๊ธฐ(-1์„ ํ•˜๋Š” ์ด์œ ๋Š” BFS๊ฐ€ ๋‚ ์งœ๋Š” 1(ํ•˜๋ฃจ)๋ถ€ํ„ฐ ์‹œ์ž‘๋˜์–ด์•ผ ํ•˜๋Š”๋ฐ 2(์ดํ‹€)๋ถ€ํ„ฐ ์‹œ์ž‘ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.)

์ต์€ ํ† ๋งˆํ† ๊ฐ€ 2๊ฐœ ์ด์ƒ ๋“ค์–ด์žˆ๋Š” ์˜ˆ์ œ ์ž…๋ ฅ 3์„ BFS๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค.

 

 

์ขŒํ‘œ๊ฐ’์ด 1์„ ๋™์‹œ์— BFS ๋Œ๋ฆฌ๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์ฒ˜์Œ queue์—๋Š” (0, 0), (3, 5)๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ๊ณ  ์ดํ›„ ํ•˜๋‚˜์”ฉ popleft()ํ•˜๋ฉด์„œ ๋‹ค์Œ ์ขŒํ‘œ๊ฐ€ 0(์ต์ง€ ์•Š์€ ํ† ๋งˆํ† )์ด๋ฉด ์ด์ „ ๊ฐ’์— +1์ด ๋ˆ„์ ๋œ๋‹ค.

 

์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๋ ค๊ณ  ์ž๊พธ ํ—ท๊ฐˆ๋ฆฌ๋Š” ๋ฌธ์žฅ์ด ์žˆ๋Š”๋ฐ, if graph[i][j] == 1:์™€ if graph[i][j]:๋Š” ๋‹ค๋ฅธ ์ฝ”๋“œ์ด๊ณ , if not graph[i][j]:์™€ if graph[i][j] == 0:๋Š” ๊ฐ™์€ ์ฝ”๋“œ์ด๋‹ค. ๊นŒ๋จน์ง€ ๋ง์ž.

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

def bfs():
    while queue:
        x, y = queue.popleft()
        print(x, y)
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]

            if 0 <= nx < n and 0 <= ny < m:
                if not graph[nx][ny]:
                    graph[nx][ny] = graph[x][y] + 1
                    queue.append((nx, ny))
    return graph

queue = deque()
m, n = map(int, input().split())
graph = [list(map(int, input().split())) for _ in range(n)]
dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]

for i in range(n):
    for j in range(m):
        if graph[i][j] == 1:
            queue.append((i, j))    # extract ripen tomatoes(value = 1)

result = bfs()    # execute bfs ripen tomatoes at the same time
print(result)
if True in map(lambda x: 0 in x, result):    # not all ripen tomatoes
    print(-1)
else:    # all ripen tomatoes or minimum days of ripen tomatoes
    print(max(map(max, result))-1)
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€