Algorithm Problem/Python

[python] ๋ฐฑ์ค€ - 2573. ๋น™์‚ฐ

deo2kim 2020. 11. 26. 20:46
๋ฐ˜์‘ํ˜•

๐Ÿค”๋ฌธ์ œ ํ•ด๊ฒฐ

  • G4 | DFS, ๊ตฌํ˜„

9๊ฐœ์›”์ „์— ํ’€์–ด๋ดค๋˜ ๋ฌธ์ œ์˜€๋Š”๋ฐ, ๊ทธ ๋•Œ๋Š” ์‹œ๊ฐ„์ดˆ๊ณผ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•ด์„œ ๊ฒจ์šฐ pypy๋กœ ์ œ์ถœํ•ด์„œ ํ†ต๊ณผํ–ˆ๋‹ค.

์ด๋ฒˆ์— ์Šคํ„ฐ๋””๋ฅผ ํ•˜๋‹ค๋ณด๋‹ˆ ๋‹ค์‹œ ํ’€๊ฒŒ ๋ผ์„œ ํšจ์œจ์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด python์œผ๋กœ๋„ ํ†ต๊ณผ๋ฅผ ํ–ˆ๋‹ค.

 

  • ๋…น์ด๋Š” ๋น™์‚ฐ ์ฐพ๊ธฐ
    • 2์ฐจ์› ๋ฐฐ์—ด ํ•˜๋‚˜์”ฉ ๋Œ๊ธฐ -> ๋น™์‚ฐ์„ ๋”ฐ๋กœ ๋ฆฌ์ŠคํŠธ๋กœ ๋งŒ๋“ค์–ด ๋‘๊ธฐ ์™€ DFS
  • ๋น™ํ•˜ ๋ฉ์–ด๋ฆฌ๊ฐ€ ํ•˜๋‚˜์ธ์ง€ ์—ฌ๋Ÿฌ๊ฐœ์ธ์ง€ ํŒ๋ณ„
    • DFS -> ๋น™์‚ฐ ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด์™€ ๋…น์ผ ๋•Œ ์„ ํƒํ•œ ๋น™์‚ฐ์˜ ์ˆ˜์˜ ์ฐจ์ด๋กœ ๋ฐ”๋กœ ๊ณ„์‚ฐ

๐Ÿ’ป์†Œ์Šค ์ฝ”๋“œ

import sys
from _collections import defaultdict

input = sys.stdin.readline


def melt():
    melting_area = {}  # ๋…น์ผ ๊ณณ
    dx, dy = [-1, 1, 0, 0], [0, 0, -1, 1]
    visited = [[0] * M for _ in range(N)]  # ๋ฐฉ๋ฌธ
    stack = []
    stack.append(iceberg[0])
    selected_iceberg = 0  # ์„ ํƒ๋œ ๋น™์‚ฐ๋“ค ( ๋‚˜์ค‘์— ์ „์ฒด ๋น™์‚ฐ๊ณผ ๋น„๊ตํ•ด์„œ ํ•œ๋ฉ์–ด๋ฆฌ์ธ์ง€ ํ™•์ธ )
    visited[iceberg[0][0]][iceberg[0][1]] = 1
    while stack:
        x, y = stack.pop()
        selected_iceberg += 1
        melting_cnt = 0
        for k in range(4):
            nx = x + dx[k]
            ny = y + dy[k]
            if arctic[nx][ny] and not visited[nx][ny]:  # ์˜†์ด ์œก์ง€์ด๋ฉด ๋‹ค์Œ ํƒ์ƒ‰
                stack.append((nx, ny))
                visited[nx][ny] = 1
            elif arctic[nx][ny] == 0:  # ์˜†์ด ๋ฐ”๋‹ค์ด๋ฉด ๋…น์ด๋Š” ์นด์šดํŠธ
                melting_cnt += 1

        melting_area[(x, y)] = melting_cnt

    # ๋…น์ด๊ธฐ
    new_iceberg = []  # ์ƒˆ๋กœ์šด ๋น™์‚ฐ์œผ๋กœ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด
    for key, value in melting_area.items():
        i, j = key
        arctic[i][j] = max(0, arctic[i][j] - value)
        if arctic[i][j] > 0:
            new_iceberg.append((i, j))

    return selected_iceberg, new_iceberg


if __name__ == '__main__':
    N, M = map(int, input().split())
    arctic = [list(map(int, input().split())) for _ in range(N)]

    # ๋น™์‚ฐ๋งŒ ์ฐพ๊ธฐ
    iceberg = []
    for i in range(N):
        for j in range(M):
            if arctic[i][j]:
                iceberg.append((i, j))

    answer = 0  # year
    while True:
        # ๋…น์ด๊ธฐ
        selected_cnt, new_iceberg = melt()
        # ํ•œ๋ฉ์–ด๋ฆฌ์ธ์ง€
        if selected_cnt != len(iceberg):
            break

        if selected_cnt == 0 or len(new_iceberg) == 0:
            answer = 0
            break
        iceberg = new_iceberg[:]

        answer += 1

    print(answer)
 

 

๐Ÿ“•๋ฌธ์ œ ํ™•์ธ

์ถœ์ฒ˜: BACKJOON ONLINE JUDGE

๋งํฌ: https://www.acmicpc.net/problem/2573

 

2573๋ฒˆ: ๋น™์‚ฐ

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

www.acmicpc.net

 

 

๋ฐ˜์‘ํ˜•