๐Ÿ˜Ž ๊ณต๋ถ€ํ•˜๋Š” ์ง•์ง•์•ŒํŒŒ์นด๋Š” ์ฒ˜์Œ์ด์ง€?

[BAEKJOON python] 2573_๋น™์‚ฐ ๋ณธ๋ฌธ

๐Ÿฆฅ ์ฝ”ํ…Œ/BAEKJOON

[BAEKJOON python] 2573_๋น™์‚ฐ

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

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

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

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

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

def bfs(x, y) :
    # ๋น™์‚ฐ ์œ„์น˜
    q = deque()
    q.append((x, y))
    # ์ฃผ๋ณ€์— ๋ฐ”๋‹ค๊ฐ€ ์žˆ๋Š” ๋น™์‚ฐ์„ (x, y, ๋ฐ”๋‹ค ๊ฐฏ์ˆ˜)
    visited[x][y] = 1
    seaList = []

    while q :
        x, y = q.popleft()
        sea = 0

        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] :
                    # ๋น™์‚ฐ ์ฃผ๋ณ€์˜ ๋ฐ”๋‹ค ๊ฐฏ์ˆ˜
                    sea += 1
                elif graph[nx][ny] and not visited[nx][ny] :
                    q.append((nx, ny))
                    visited[nx][ny] = 1
            
        if sea > 0 :
            seaList.append((x, y, sea))
    # ๋น™์‚ฐ ๋…น์ด๊ธฐ
    for x, y, sea in seaList :
        graph[x][y] = max(0, graph[x][y] - sea)
    
    # ํ•˜๋‚˜์˜ ๊ทธ๋ฃน์„ ํƒ์ƒ‰
    return 1


N, M = map(int, input().split())
graph = []

for i in range(N) :
    graph.append(list(map(int, input().split())))

dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
year = 0
ice = []

for i in range(N) :
    for j in range(M) :
        if graph[i][j] :
            # ๋น™์‚ฐ์˜ ์œ„์น˜๋ฅผ (i, j)
            ice.append((i, j))

while ice :
    visited = [[0] * (M) for _ in range(N)]
    delList = []

    # bfs() ์—์„œ ๋ฐ›์•„์˜จ ๋น™์‚ฐ ๊ทธ๋ฃน์˜ ๊ฐœ์ˆ˜
    result = 0

    for i, j in ice :
        # ๋น™์‚ฐ ๊ฐœ์ˆ˜ ๋”ํ•˜๊ธฐ
        if graph[i][j] and not visited[i][j] :
            result += bfs(i, j)
        # ๋น™์‚ฐ์ด ์—†๋‹ค๋ฉด
        if graph[i][j] == 0 :
            delList.append((i, j))

    # ๋น™์‚ฐ ๊ทธ๋ฃน์ด 2๊ฐœ ์ด์ƒ์ด๋ฉด
    if result > 1 :
        print(year)
        break
    
    # ๋‹ค ๋…น์€ ๋น™์‚ฐ ์ œ๊ฑฐ
    ice = sorted(list(set(ice) - set(delList)))
    year += 1

if result < 2 :
    print(0)

# input
# 5 7
# 0 0 0 0 0 0 0
# 0 2 4 5 3 0 0
# 0 3 0 2 5 2 0
# 0 7 6 2 4 0 0
# 0 0 0 0 0 0 0

# output
# 2
728x90
๋ฐ˜์‘ํ˜•
Comments