[BOJ] 2638. ์น˜์ฆˆ (๐Ÿฅ‡, BFS)

lemythe423ยท2023๋…„ 12์›” 9์ผ
0

BOJ ๋ฌธ์ œํ’€์ด

๋ชฉ๋ก ๋ณด๊ธฐ
82/133
post-thumbnail

๐Ÿ”—

ํ’€์ด

์™ธ๋ถ€ ๊ณต๊ธฐ์™€ 2๋ฉด ์ด์ƒ ๋งž๋‹ฟ์€ ์น˜์ฆˆ๋“ค์€ ์‚ฌ๋ผ์ง€๊ฒŒ ๋œ๋‹ค. ๋ชจ๋“  ์น˜์ฆˆ๊ฐ€ ์‚ฌ๋ผ์ง€๋Š”๋ฐ ์–ผ๋งˆ์˜ ์‹œ๊ฐ„์ด ์†Œ์š”๋˜๋Š”์ง€ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

์ตœ์†Œ ์‹œ๊ฐ„์„ ๊ตฌํ•˜๋ฉฐ ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰์ด๊ธฐ ๋•Œ๋ฌธ์— ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ–ˆ๋‹ค. ์ด๋•Œ ์™ธ๋ถ€ ๊ณต๊ธฐ๋ผ๋Š” ๊ฐœ๋…์ด ๋ญ”์ง€ ์–ด๋–ป๊ฒŒ ๊ตฌํ•ด์•ผํ•˜๋Š”์ง€ ์•„์ด๋””์–ด๋ฅผ ๋– ์˜ฌ๋ฆฌ๋Š” ๊ฒŒ ์ข€ ์˜ค๋ž˜๊ฑธ๋ ธ๋‹ค.

์šฐ์„  ํ’€์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง„ํ–‰ํ–ˆ๋‹ค.

  1. ์ด์ „์— ์™ธ๋ถ€ ๊ณต๊ธฐ๋“ค์„ ํ์— ๋‹ด๊ณ  ๋‹ค์Œ ์™ธ๋ถ€ ๊ณต๊ธฐ๋“ค์„ ์ฐพ๋Š”๋‹ค.
  2. ์™ธ๋ถ€ ๊ณต๊ธฐ๋“ค์„ ํ์— ๋„ฃ๊ณ  ๋งž๋‹ฟ์€ ์น˜์ฆˆ๋“ค์„ ์ฐพ๋Š”๋‹ค. ์™ธ๋ถ€ ๊ณต๊ธฐ๋“ค๊ณผ ๋งŒ๋‚  ๋•Œ๋งˆ๋‹ค ์น˜์ฆˆ๋“ค์˜ visited ๊ฐ’์„ +1 ํ•ด์ค€๋‹ค.
  3. ์ „์ฒด ๋ฐฐ์—ด์„ ๋Œ๋ฉด์„œ ์™ธ๋ถ€ ๊ณต๊ธฐ๋“ค๊ณผ ๋งŒ๋‚œ ๊ฐ’์ด 2์ด์ƒ์ธ ์น˜์ฆˆ๋“ค์„ ์ฐพ์•„์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋‹ค์Œ ์™ธ๋ถ€ ๊ณต๊ธฐ๊ฐ€ ๋˜๋Š” ๊ฐ’๋“ค์ด ๋œ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์— ๋‚ด๋ถ€ ๊ณต๊ธฐ๋ผ๋Š” ๊ฐœ๋…์ด ๋“ค์–ด๊ฐ€๋ฉด์„œ ์ข€ ๊ผฌ์˜€๋‹ค. ์™ธ๋ถ€ ๊ณต๊ธฐ๊ฐ€ ์น˜์ฆˆ๋ฅผ ๋…น์ด๋ฉด์„œ ์น˜์ฆˆ์˜ ๋‚ด๋ถ€์— ์žˆ๋Š” ๋‚ด๋ถ€ ๊ณต๊ธฐ๋“ค๊ณผ ๋งŒ๋‚˜๊ฒŒ ๋˜๋Š”๋ฐ, ๋‚ด๋ถ€ ๊ณต๊ธฐ๋“ค์€ ์™ธ๋ถ€ ๊ณต๊ธฐ์™€ ๋งŒ๋‚˜๊ฒŒ ๋˜๋ฉด ๊ณง๋ฐ”๋กœ ๋งž๋‹ฟ์€ ์น˜์ฆˆ๋“ค์„ ์‚ฌ๋ผ์ง€๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์ด๋ฏธ ํ•œ ๋ฒˆ ์น˜์ฆˆ๋“ค์„ ์‚ฌ๋ผ์ง€๊ฒŒ ํ•œ ํ›„, ์™ธ๋ถ€ ๊ณต๊ธฐ์™€ ๋งž๋‹ฟ์•„์„œ ์‚ฌ๋ผ์ง€๊ฒŒ ํ•œ ์น˜์ฆˆ๋“ค์€ ๋‹ค์Œ ๋ฒˆ์— ์™ธ๋ถ€ ๊ณต๊ธฐ๊ฐ€ ๋˜๋Š”๋ฐ, ์ด๋•Œ์˜ ์™ธ๋ถ€ ๊ณต๊ธฐ๋“ค๊ณผ ๋งŒ๋‚˜๊ฒŒ ๋˜๋Š” ์น˜์ฆˆ์˜ ๋‚ด๋ถ€์— ์žˆ๋Š” ๋‚ด๋ถ€ ๊ณต๊ธฐ๋“ค์€ ํ์— ๋‹ด๊ฒจ์„œ ๋‹ค์Œ ๋ฒˆ ์—ฐ์‚ฐ์œผ๋กœ ๋„˜์–ด๊ฐ€๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ์ด๋•Œ์˜ ์™ธ๋ถ€ ๊ณต๊ธฐ๋“ค๊ณผ ํ•ฉ์ณ์ ธ์„œ ๋งž๋‹ฟ์€ ์น˜์ฆˆ๋“ค์„ ์‚ฌ๋ผ์ง€๊ฒŒ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์•ž์„œ ์ด์ „์— ๋ฐ›์•˜๋˜ ์™ธ๋ถ€ ๊ณต๊ธฐ๋“ค์— ์ƒˆ๋กญ๊ฒŒ ์ฐพ์€ ๋‚ด๋ถ€ ๊ณต๊ธฐ์˜ ์œ„์น˜๋“ค์„ ํ•ฉ์ณ์„œ ๋งž๋‹ฟ์€ ์น˜์ฆˆ๋ฅผ ์‚ฌ๋ผ์ง€๊ฒŒ ํ•˜๋ฉด ๋œ๋‹ค.

# ์น˜์ฆˆ

import sys
sys.stdin = open('input.txt')
from collections import deque

def is_valid(x, y):
    return 0 <= x < N and 0 <= y < M

def bfs(queue):
    # ์™ธ๋ถ€ ๊ณต๊ธฐ ์ฐพ๊ธฐ
    next_queue = queue.copy()
    while queue:
        x, y = queue.popleft()
        for k in range(4):
            nx, ny = x + dx[k], y + dy[k]
            if not is_valid(nx, ny) or visited[nx][ny] or cheeze[nx][ny]:
                continue
            next_queue.append((nx, ny))
            queue.append((nx, ny))
            visited[nx][ny] = 1

    # ๋งž๋‹ฟ์€ ์น˜์ฆˆ ์ฐพ๊ธฐ
    while next_queue:
        x, y = next_queue.popleft()
        for k in range(4):
            nx, ny = x + dx[k], y + dy[k]
            if not is_valid(nx, ny) or not cheeze[nx][ny]:
                continue
            visited[nx][ny] += 1

    cheeze_queue = deque()
    for x in range(N):
        for y in range(M):
            if cheeze[x][y] and visited[x][y] >= 2:
                cheeze_queue.append((x, y))
                cheeze[x][y] = 0
    # for row in cheeze:
    #     print(*row)
    # print(cheeze_queue)
    return cheeze_queue
            
def is_all_find():
    for row in cheeze:
        if sum(row):
            return False
    return True

N, M = map(int, input().split())
cheeze = [list(map(int, input().split())) for _ in range(N)]

queue = deque([(0, 0)])
out_air = deque()
visited = [[0] * M for _ in range(N)]
dx = (0, 1, -1, 0)
dy = (1, 0, 0, -1)


hour = 0
while not is_all_find():
    queue = bfs(queue)
    hour += 1

print(hour)
profile
์•„๋ฌด๋ง์ด๋‚˜ํ•˜๊ธฐ

0๊ฐœ์˜ ๋Œ“๊ธ€