DevYoon

[๋ฐฑ์ค€] 2573. ๋น™์‚ฐ (Python) ๋ณธ๋ฌธ

PS/Baekjoon

[๋ฐฑ์ค€] 2573. ๋น™์‚ฐ (Python)

gimewn 2023. 7. 31. 00:28

link ๐Ÿ”— https://www.acmicpc.net/problem/2573

๋ฌธ์ œ ์„ค๋ช…

์ง€๊ตฌ ์˜จ๋‚œํ™”๋กœ ์ธํ•˜์—ฌ ๋ถ๊ทน์˜ ๋น™์‚ฐ์ด ๋…น๊ณ  ์žˆ๋‹ค. ๋น™์‚ฐ์„ ๊ทธ๋ฆผ 1๊ณผ ๊ฐ™์ด 2์ฐจ์› ๋ฐฐ์—ด์— ํ‘œ์‹œํ•œ๋‹ค๊ณ  ํ•˜์ž. ๋น™์‚ฐ์˜ ๊ฐ ๋ถ€๋ถ„๋ณ„ ๋†’์ด ์ •๋ณด๋Š” ๋ฐฐ์—ด์˜ ๊ฐ ์นธ์— ์–‘์˜ ์ •์ˆ˜๋กœ ์ €์žฅ๋œ๋‹ค. ๋น™์‚ฐ ์ด์™ธ์˜ ๋ฐ”๋‹ค์— ํ•ด๋‹น๋˜๋Š” ์นธ์—๋Š” 0์ด ์ €์žฅ๋œ๋‹ค. ๊ทธ๋ฆผ 1์—์„œ ๋นˆ์นธ์€ ๋ชจ๋‘ 0์œผ๋กœ ์ฑ„์›Œ์ ธ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

2 4 5 3
3 2 5 2
7 6 2 4

๊ทธ๋ฆผ 1. ํ–‰์˜ ๊ฐœ์ˆ˜๊ฐ€ 5์ด๊ณ  ์—ด์˜ ๊ฐœ์ˆ˜๊ฐ€ 7์ธ 2์ฐจ์› ๋ฐฐ์—ด์— ์ €์žฅ๋œ ๋น™์‚ฐ์˜ ๋†’์ด ์ •๋ณด

๋น™์‚ฐ์˜ ๋†’์ด๋Š” ๋ฐ”๋‹ท๋ฌผ์— ๋งŽ์ด ์ ‘ํ•ด์žˆ๋Š” ๋ถ€๋ถ„์—์„œ ๋” ๋นจ๋ฆฌ ์ค„์–ด๋“ค๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐฐ์—ด์—์„œ ๋น™์‚ฐ์˜ ๊ฐ ๋ถ€๋ถ„์— ํ•ด๋‹น๋˜๋Š” ์นธ์— ์žˆ๋Š” ๋†’์ด๋Š” ์ผ๋…„๋งˆ๋‹ค ๊ทธ ์นธ์— ๋™์„œ๋‚จ๋ถ ๋„ค ๋ฐฉํ–ฅ์œผ๋กœ ๋ถ™์–ด์žˆ๋Š” 0์ด ์ €์žฅ๋œ ์นธ์˜ ๊ฐœ์ˆ˜๋งŒํผ ์ค„์–ด๋“ ๋‹ค. ๋‹จ, ๊ฐ ์นธ์— ์ €์žฅ๋œ ๋†’์ด๋Š” 0๋ณด๋‹ค ๋” ์ค„์–ด๋“ค์ง€ ์•Š๋Š”๋‹ค. ๋ฐ”๋‹ท๋ฌผ์€ ํ˜ธ์ˆ˜์ฒ˜๋Ÿผ ๋น™์‚ฐ์— ๋‘˜๋Ÿฌ์‹ธ์—ฌ ์žˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ทธ๋ฆผ 1์˜ ๋น™์‚ฐ์€ ์ผ๋…„ํ›„์— ๊ทธ๋ฆผ 2์™€ ๊ฐ™์ด ๋ณ€ํ˜•๋œ๋‹ค.

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

2 4 1
1 1 5
5 4 1 2

๊ทธ๋ฆผ 2

3
4
3 2

๊ทธ๋ฆผ 3

ํ•œ ๋ฉ์–ด๋ฆฌ์˜ ๋น™์‚ฐ์ด ์ฃผ์–ด์งˆ ๋•Œ, ์ด ๋น™์‚ฐ์ด ๋‘ ๋ฉ์–ด๋ฆฌ ์ด์ƒ์œผ๋กœ ๋ถ„๋ฆฌ๋˜๋Š” ์ตœ์ดˆ์˜ ์‹œ๊ฐ„(๋…„)์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ๊ทธ๋ฆผ 1์˜ ๋น™์‚ฐ์— ๋Œ€ํ•ด์„œ๋Š” 2๊ฐ€ ๋‹ต์ด๋‹ค. ๋งŒ์ผ ์ „๋ถ€ ๋‹ค ๋…น์„ ๋•Œ๊นŒ์ง€ ๋‘ ๋ฉ์–ด๋ฆฌ ์ด์ƒ์œผ๋กœ ๋ถ„๋ฆฌ๋˜์ง€ ์•Š์œผ๋ฉด ํ”„๋กœ๊ทธ๋žจ์€ 0์„ ์ถœ๋ ฅํ•œ๋‹ค.

์ž…๋ ฅ

์ฒซ ์ค„์—๋Š” ์ด์ฐจ์› ๋ฐฐ์—ด์˜ ํ–‰์˜ ๊ฐœ์ˆ˜์™€ ์—ด์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋‘ ์ •์ˆ˜ N๊ณผ M์ด ํ•œ ๊ฐœ์˜ ๋นˆ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค. N๊ณผ M์€ 3 ์ด์ƒ 300 ์ดํ•˜์ด๋‹ค. ๊ทธ ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ ์ค„๋งˆ๋‹ค ๋ฐฐ์—ด์˜ ๊ฐ ํ–‰์„ ๋‚˜ํƒ€๋‚ด๋Š” M๊ฐœ์˜ ์ •์ˆ˜๊ฐ€ ํ•œ ๊ฐœ์˜ ๋นˆ ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ์นธ์— ๋“ค์–ด๊ฐ€๋Š” ๊ฐ’์€ 0 ์ด์ƒ 10 ์ดํ•˜์ด๋‹ค. ๋ฐฐ์—ด์—์„œ ๋น™์‚ฐ์ด ์ฐจ์ง€ํ•˜๋Š” ์นธ์˜ ๊ฐœ์ˆ˜, ์ฆ‰, 1 ์ด์ƒ์˜ ์ •์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ์นธ์˜ ๊ฐœ์ˆ˜๋Š” 10,000 ๊ฐœ ์ดํ•˜์ด๋‹ค. ๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ํ–‰๊ณผ ์—ด, ๋งˆ์ง€๋ง‰ ํ–‰๊ณผ ์—ด์—๋Š” ํ•ญ์ƒ 0์œผ๋กœ ์ฑ„์›Œ์ง„๋‹ค.

์ถœ๋ ฅ

์ฒซ ์ค„์— ๋น™์‚ฐ์ด ๋ถ„๋ฆฌ๋˜๋Š” ์ตœ์ดˆ์˜ ์‹œ๊ฐ„(๋…„)์„ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์ผ ๋น™์‚ฐ์ด ๋‹ค ๋…น์„ ๋•Œ๊นŒ์ง€ ๋ถ„๋ฆฌ๋˜์ง€ ์•Š์œผ๋ฉด 0์„ ์ถœ๋ ฅํ•œ๋‹ค.




์ฝ”๋“œ

import sys
from collections import deque

# ๋„ค ๋ฐฉํ–ฅ์œผ๋กœ ๋ถ™์–ด ์žˆ๋Š” 0์ธ ์นธ ๊ฐœ์ˆ˜ ํ™•์ธ
def check_dir(x, y):
    count = 0
    for i, j in [(0, 1), (0, -1), (1, 0), (-1, 0)]:
        dx, dy = x+i, y+j
        if 0 > dx or dx >= X or 0 > dy or dy >= Y:
            continue
        if not board[dx][dy]:
            count += 1
    return count

# ๋น™์‚ฐ ์ฐพ๊ธฐ
def find_ice():
    newQ = deque()
    for x in range(X):
        for y in range(Y):
            if board[x][y]:
                # ๋น™์‚ฐ์ด๋ฉด q์— ๋‹ด๊ธฐ
                newQ.append((x, y))
    return newQ, len(newQ)

# ๋น™์‚ฐ๋“ค ๋…น์ด๊ธฐ
def melt_ice(q):
    melt = deque()
    while q:
        nx, ny = q.popleft()
        count = check_dir(nx, ny)
        melt.append((nx, ny, count))

    for mx, my, mCount in melt:
        board[mx][my] -= mCount
        if board[mx][my] < 0:
            board[mx][my] = 0

# ๋น™์‚ฐ ๋ฉ์–ด๋ฆฌ ๊ตฌํ•˜๊ธฐ
def bfs_ice(x, y):

    q = deque([(x, y)])
    count = set([(x, y)])

    while q:
        nx, ny = q.popleft()

        for i, j in [(0, 1), (0, -1), (1, 0), (-1, 0)]:
            dx, dy = nx+i, ny+j
            if 0 > dx or dx >= X or 0 > dy or dy >= Y:
                continue
            if board[dx][dy] and (dx, dy) not in count:
                q.append((dx, dy))
                count.add((dx, dy))
    return len(count)

X, Y = map(int, input().split())

board = [list(map(int, sys.stdin.readline().split())) for _ in range(X)]
turn = 0

# ์ดˆ๊ธฐ ๋น™์‚ฐ๊ณผ ๊ทธ ๊ฐœ์ˆ˜
q, ice = find_ice()

while True:
    turn += 1
    melt_ice(q)
    q, ice = find_ice()
    if q:
        bfs_count = bfs_ice(q[0][0], q[0][1])
    else:
        break

    # ๋น™์‚ฐ ๊ฐœ์ˆ˜์™€ ์ฒซ ๋ฒˆ์งธ ๋น™์‚ฐ์œผ๋กœ ๊ตฌํ•œ ๋ฉ์–ด๋ฆฌ ํฌ๊ธฐ(๊ฐœ์ˆ˜)๊ฐ€ ๋ถˆ์ผ์น˜ํ•˜๋ฉด
    # ๋ฉ์–ด๋ฆฌ๊ฐ€ ๋ถ„๋ฆฌ๋œ ๊ฒƒ
    if bfs_count != ice:
        print(turn)
        exit(0)

# ๋น™์‚ฐ ๋‹ค ๋…น์„ ๋•Œ๊นŒ์ง€ ๋ถ„๋ฆฌ๋˜์ง€ ์•Š์œผ๋ฉด 0 ์ถœ๋ ฅ
print(0)
  • ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํฌ๊ฒŒ 4๋‹จ๊ณ„๋กœ ๊ตฌ๋ถ„ํ•ด ํ’€์—ˆ๋‹ค.
    1. ๋น™์‚ฐ ๊ตฌํ•˜๊ธฐ
      • ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉด์„œ ๋น™์‚ฐ์ธ ๊ฒƒ๋“ค์„ ๊ตฌํ•ด์„œ deque์— ๋‹ด๋Š”๋‹ค.
    2. ๋น™์‚ฐ ๋…น์ด๊ธฐ
      • ์œ„์—์„œ ๊ตฌํ•œ ๋น™์‚ฐ ๋ฐฐ์—ด์„ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด์„œ ์‚ฌ๋ฐฉํ–ฅ์˜ 0์ธ ์นธ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๊ณ , ๊ทธ ๊ฐœ์ˆ˜๋งŒํผ ๋…น์ธ๋‹ค.
    3. ์ƒˆ๋กœ ๋น™์‚ฐ ๊ตฌํ•˜๊ธฐ
      • ๋น™์‚ฐ์„ ๋…น์˜€์œผ๋‹ˆ ๋‹ค์‹œ ์ƒˆ๋กœ์šด ๋น™์‚ฐ ๋ฐฐ์—ด์„ ๊ตฌํ•œ๋‹ค.
    4. ๋น™์‚ฐ ๋ถ„๋ฆฌ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ
      • bfs๋ฅผ ํ™œ์šฉํ•ด์„œ ๋น™์‚ฐ ๋ฐฐ์—ด์—์„œ ๊ฐ€์žฅ ์ฒซ๋ฒˆ์งธ ์ขŒํ‘œ๋ฅผ ๊ฐ€์ง€๊ณ  ๋ฉ์–ด๋ฆฌ์˜ ํฌ๊ธฐ๋ฅผ ๊ตฌํ•œ๋‹ค.
      • ๋งŒ์•ฝ ๋น™์‚ฐ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ(๊ธธ์ด)์™€ bfs๋กœ ๊ตฌํ•œ ๋ฉ์–ด๋ฆฌ์˜ ํฌ๊ธฐ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๋น™์‚ฐ์€ ๋ฉ์–ด๋ฆฌ๊ฐ€ 2๊ฐœ ํ˜น์€ ๊ทธ ์ด์ƒ์œผ๋กœ ๋ถ„๋ฆฌ๋œ ๊ฒƒ์ด๋‹ค.
  • ์ฃผ์˜์‚ฌํ•ญ
    • ๋น™์‚ฐ์ด ๋ชจ๋‘ ๋…น์„ ๋•Œ๊นŒ์ง€ ๋ฉ์–ด๋ฆฌ๊ฐ€ ๋ถ„๋ฆฌ๋˜์ง€ ์•Š์œผ๋ฉด 0์„ ์ถœ๋ ฅํ•ด์ค˜์•ผ ํ•œ๋‹ค.
    • ์ฝ”๋“œ์—์„œ q๊ฐ€ ๋น„์—ˆ์„ ๋•Œ(๋น™์‚ฐ์ด ๋” ์—†๋‹ค๋Š” ๋œป) break๋กœ while๋ฌธ์„ ํƒˆ์ถœํ•˜๊ณ , ๋งˆ์ง€๋ง‰์— 0์„ printํ•ด์คฌ๋‹ค.