백준 2573번 python 풀이 - 빙산
문제 링크
해결책
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
import sys
N, M = map(int, sys.stdin.readline().rstrip().split())
values = []
iceburgs = []
total_iceburg = N * M
for i in range(N):
temp_list = list(map(int, sys.stdin.readline().rstrip().split()))
for _ in range(len(temp_list)):
if temp_list[_] == 0:
total_iceburg -= 1
else:
iceburgs.append((i,_))
values.append(temp_list)
dx = [1, 0, -1, 0]
dy = [0, -1, 0, 1]
year = 0
while True:
is_visited = [[False for i in range(M)] for j in range(N)]
if len(iceburgs) == 0:
print(0)
exit()
sx, sy = iceburgs[0]
remain_iceburg_modify = 1
stk = [(sx, sy)]
is_visited[sx][sy] = True
# 이번 년도에 녹은 애들을 저장하기 위한 새로운 values
melt_list = []
while stk:
nx, ny = stk.pop()
# ice에는 해당 칸이 이번 년도에 녹을 수치를 넣는다.
ice = 0
for i in range(4):
if -1 < nx + dx[i] < N and -1 < ny + dy[i] < M:
if values[nx + dx[i]][ny + dy[i]] <= 0:
ice += 1
elif is_visited[nx + dx[i]][ny + dy[i]] is False:
remain_iceburg_modify += 1
stk.append((nx + dx[i], ny + dy[i]))
is_visited[nx + dx[i]][ny + dy[i]] = True
melt_list.append((nx, ny, ice))
melted_cnt = 0
for nx, ny, ice in melt_list:
values[nx][ny] -= ice
if values[nx][ny] <= 0:
iceburgs.remove((nx, ny))
melted_cnt += 1
year += 1
if remain_iceburg_modify <= 0:
print(0)
exit()
if remain_iceburg_modify < total_iceburg:
print(year - 1)
exit()
total_iceburg -= melted_cnt
주석으로 달 설명
해결하였다. 시간초과의 원인은, 스택에 요소가 있는지 확인하는 부분에 있었다. 그냥 추가할때 isVisited에 변화를 주면 된다.
This post is licensed under CC BY 4.0 by the author.