[BOJ] 16920. ํ™•์žฅ ๊ฒŒ์ž„ (๐Ÿฅ‡, BFS)

lemythe423ยท2023๋…„ 10์›” 11์ผ
0

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

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

๐Ÿ”—

ํ’€์ด

ํ”Œ๋ ˆ์ด์–ด๋“ค์ด ์ˆœ์„œ๋Œ€๋กœ s๋งŒํผ ํ™•์žฅํ•ด๋‚˜๊ฐ„๋‹ค. ํ™•์žฅ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์„ ์‚ฌ์šฉํ–ˆ๋‹ค. ํ”Œ๋ ˆ์ด์–ด๋“ค์ด ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ์œ„์น˜๋ฅผ ์ €์žฅํ•ด๋’€๋‹ค๊ฐ€ ๊ฐ ํ„ด๋งˆ๋‹ค ๊ทธ ์œ„์น˜๋“ค์—์„œ ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์„ ํ†ตํ•ด ํ™•์žฅํ•ด๋‚˜๊ฐ”๋‹ค. s๋งŒํผ ํ™•์žฅํ•˜๊ณ  ๋งˆ์ง€๋ง‰์— ์ €์žฅ๋œ ์œ„์น˜๋“ค์€ ๋‹ค์Œ ํ„ด์— ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค์‹œ ์ €์žฅํ–ˆ๋‹ค.

ํ™•์žฅ์€ ๋” ์ด์ƒ ํ™•์žฅ์ด ์ง„ํ–‰๋  ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ์ด๋ฃจ์–ด์ง„๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์—ฌ๊ธฐ์„œ ๋‹ค๋“ค ๋” ์ด์ƒ ๋‚จ์€ ์นธ์ด ์—†์„ ๋•Œ๊นŒ์ง€๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ , ๋‚˜๋„ ๊ทธ๋žฌ๋‹ค. ๊ทธ๋ž˜์„œ . ์นธ์ด ๋‚จ์•„์žˆ๋‹ค๋ฉด~ ์œผ๋กœ ์ ‘๊ทผํ–ˆ์ง€๋งŒ ์•ˆํƒ€๊น๊ฒŒ๋„ ์‹œ๊ฐ„์ดˆ๊ณผ์— ๊ฑธ๋ ธ๋‹ค.

๋ฐ”๋กœ ์ด๋Ÿฐ ๋ฐ˜๋ก€ ๋•Œ๋ฌธ์ด๋‹ค.

1#........
#.........
2#.......#
3#......#4

๋ฒฝ์— ๊ฐ€๋กœ๋ง‰ํ˜€ ๋” ์ด์ƒ ์ด๋™ํ•  ์ˆ˜ ์—†์–ด์„œ ๋‹ค ์ฑ„์šธ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋„ ๋ฌดํ•œ์œผ๋กœ ๋Œ์•„๊ฐ€๋‹ค๋ณด๋‹ˆ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚œ ๊ฒƒ์ด์—ˆ๋‹ค. ์œ„์˜ ๋ฐ˜๋ก€๋Š” ์•„์ฃผ ๊ทน๋‹จ์ ์ธ ์˜ˆ์ œ์ธ๋ฐ ์ด๋Ÿฐ ๊ฒฝ์šฐ๋ง๊ณ  ๋ฒฝ์— ๋‘˜๋Ÿฌ์‹ธ์ธ .๋ผ๋˜๊ฐ€ ์ด๋Ÿฐ ๊ฒŒ ํ•˜๋‚˜๋ผ๋„ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ๋‚ด๊ฐ€ ๊ฑด ์ข…๋ฃŒ์กฐ๊ฑด์œผ๋กœ๋Š” ์ข…๋ฃŒ๋  ์ˆ˜ ์—†์—ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋” ์ด์ƒ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ์œ„์น˜๊ฐ€ ์—†์„ ๋•Œ ์ข…๋ฃŒํ–ˆ๋‹ค. ์œ„์—์„œ ๋‹ค์Œ ํ„ด๋งˆ๋‹ค ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด ํƒ์ƒ‰ํ•  ์œ„์น˜๋“ค์„ ์ €์žฅํ•œ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ ์ด ์œ„์น˜๋“ค์ด ๋ชจ๋“  ํ”Œ๋ ˆ์ด์–ด์—๊ฒŒ ๋‹จ ํ•˜๋‚˜๋„ ๋‚จ์•„์žˆ์ง€ ์•Š์„ ๋•Œ ์ข…๋ฃŒํ•˜๋Š” ์กฐ๊ฑด์ด๋‹ค.

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

def is_finish():
    return sum(list(castle.values())) != total\
            and any(list(player.values()))

def bfs(queue, p, s):
    global castle
    while queue and s:
        new_queue = []
        for r, c in queue:
            for dr, dc in dirs:
                nr, nc = r+dr, c+dc 
                if 0<=nr<N and 0<=nc<M and board[nr][nc] == '.' and board[nr][nc] != '#':
                    board[nr][nc] = p 
                    new_queue.append((nr, nc))
        queue = new_queue[:]
        castle[p] += len(queue)
        s -= 1

    return queue

N, M, P = map(int, input().split())
S = list(map(int, input().split()))
board = [list(input()) for _ in range(N)]
player = defaultdict(list)
castle = defaultdict(int)
dirs = [(0, 1), (1, 0), (-1, 0), (0, -1)]
total = N*M

for i in range(N):
    for j in range(M):
        if board[i][j].isdigit():
            player[board[i][j]].append((i, j))
            castle[board[i][j]] += 1
        if board[i][j] == '#':
            total -= 1

while is_finish():
    for i in range(1, P+1):
        p = str(i)
        if not player[p]:
            continue
        player[p] = bfs(player[p], p, S[i-1])

for i in range(1, P+1):
    print(castle[str(i)], end=' ')
print()
profile
์•„๋ฌด๋ง์ด๋‚˜ํ•˜๊ธฐ

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