이 문제는 일반적인 그래프에서 집합 개수 찾는 것과 시간마다 달라지는 그래프를 적용하여 푸는 문제이다.
여기서 중요하다고 느낀점은 빙하가 물과 닿는 개수대로 빙하가 녹게 되는데 녹일때 조심해야한다.
예를 들어
0 0 0
0 3 5
0 0 0
이라고 한다면 내년에는
0 0 0
0 0 3
0 0 0 이 되어야한다.
그러나 코드를 잘못짜면
0 0 0
0 0 2
0 0 0 이 될수 있다. 그래서 나는 filter 배열을 만들고 빙하별로 인접한 방향의 수를 구하고 제거하는 방식으로 코드를 구현했다.
n,m = map(int , input().split())
M = []
big = 0
for _ in range(n):
tmp = list(map(int, input().split()))
M.append(tmp)
from time import sleep
def DFS(i,j, visited):
s = [[i,j]]
visited[i][j] = 1
dy = [0,0,1,-1] #동서남북
dx = [1,-1,0,0]
while s:
y,x = s.pop()
visited[y][x]=1
for i in range(4):
ny = y + dy[i]
nx = x + dx[i]
if (0<=ny<n) and (0<=nx<m) and M[ny][nx] > 0 and visited[ny][nx]==0:
s.append([ny,nx])
def findIsland():
count =0
visited = [[0 for i in range(m)] for i in range(n)]
for i in range(n):
for j in range(m):
if M[i][j] != 0 and visited[i][j] == 0:
DFS(i,j,visited)
count+=1
if count >= 2:
return True
else:
return False
def melt():
dy = [0,0,1,-1]
dx = [1,-1,0,0]
fileter = [[0 for i in range(m)] for i in range(n)]
for y in range(n):
for x in range(m):
if M[y][x] != 0:
for z in range(4):
ny = y + dy[z]
nx = x + dx[z]
if (0<=ny<n) and (0<=nx<m) and M[ny][nx] == 0:
fileter[y][x] +=1
for y in range(n):
for x in range(m):
M[y][x] -= fileter[y][x]
if M[y][x] < 0:
M[y][x] = 0
def checkice():
total = 0
for i in range(n):
total += sum(M[i])
if total == 0:
return True
else:
return False
flag = 0
i = 0
while True:
if findIsland():
flag = i
break
else:
if checkice():
break
melt()
i+=1
if flag != 0:
print(flag)
else:
print(0)
아쉬운점은 시간 복잡도를 크게 생각하고 짜지 않아서 python으로 제출하는 경우 시간초과가 난다. 다음에는 시간을 좀더 줄이는 방식으로 구현해 보아야 겠다.
'알고리즘' 카테고리의 다른 글
[python3] 백준 1967 풀이 (트리의 지름, DFS) (0) | 2021.07.26 |
---|---|
[python3] 백준 1937 풀이 (욕심쟁이 판다, DFS, DP) (0) | 2021.07.26 |
[c++] 백준 14476 (최대공약수 하나빼기, 누적합, 최대공약수, 유클리드 호제법) (0) | 2021.07.22 |
백준 1202 보석도둑 c++ 풀이 (priority queue, vector, 우선순위 큐) (0) | 2021.07.21 |
백준 3055 C++ 풀이 (탈출, BFS) (0) | 2021.07.19 |