Post

🦊 빙산

1. 문제 링크

2573번: 빙산



2. 코드

pypy3 242500kb 2136ms

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import sys
sys.setrecursionlimit(10005)

N, M = map(int, input().split())

T = 0
MAP = []
ICEBURG = []
VISIT_MAP = []
for i in range(N):
    MAP.append(list(map(int, sys.stdin.readline().split())))
    
    for j in range(M):
        if MAP[i][j] != 0:
            ICEBURG.append([j, i, MAP[i][j]]) # (x, y, size) 저장
    
# 방문맵 초기화
def init():
    global VISIT_MAP
    VISIT_MAP = [[0] * M for i in range(N)]
    
def dfs(x, y):
    global MAP, VISIT_MAP, N, M
    delta = [[0, 1], [0, -1], [1, 0], [-1, 0]]
    VISIT_MAP[y][x] = 0
    for dx, dy in delta:
        nx = x + dx
        ny = y + dy
        if 0 <= nx < M and 0 <= ny < N and VISIT_MAP[ny][nx] == 1:
            dfs(nx, ny)

# 방문맵 검사
def countIceburg():
    global MAP, VISIT_MAP, N, M, T
    init()
    count = 0
    
    # 빙산 있는 곳을 체크
    for i in range(N):
        for j in range(M):
            if MAP[i][j] > 0:
                VISIT_MAP[i][j] = 1
    for i in range(N):
        for j in range(M):                
            if VISIT_MAP[i][j] == 1:
                dfs(j, i)
                count += 1

    # 두개 이상의 빙산으로 나뉘어짐
    return count

while countIceburg() == 1:
    T += 1
    delta = [[0, 1], [0, -1], [1, 0], [-1, 0]]
    melt = []
    for x, y, size in ICEBURG:
        if size == 0:
            continue
        count = 0
        for dx, dy in delta:
            nx = x + dx
            ny = y + dy
            if 0 <= nx < M and 0 <= ny < N and MAP[ny][nx] == 0:
                count += 1
        melt.append([x, y, max(0, size - count)])
    
    for x, y, size in melt:
        MAP[y][x] = size

        
    ICEBURG = melt.copy()

if countIceburg() == 0:
    print(0)
else:
    print(T)
  • 해설

    빙산의 좌표를 저장

    해당 빙산의 다음 좌표를 기록

    맨 마지막에 반영시킴

    dfs 를 통해 빙산의 개수 구해서 1이 아니면 루프 종료

    0이면 빙산이 모두 녹아버림

    2 이상이면 빙산이 분리되어짐

This post is licensed under CC BY 4.0 by the author.