https://www.acmicpc.net/problem/16234
Python에서 메모리 초과, 시간 초과 문제 해결에 오래 걸린 문제.
visited 배열의 활용 뿐만 아니라 다음 interation에서 이전에 인구 이동이 있었던 구역을 추가로 배제해주는 logic도 포함하니 AC를 받을 수 있었다.
효율적으로 한번만 돌려야했지만 중복으로 사용했던 For 문을 제거한 것도 AC에 기여했다.
from collections import deque
N,L,R = map(int,input().split())
arr = [list(map(int,input().split())) for _ in range(N)]
def check(ny,nx,y,x):
"""
this 와 there 의 차이가 L 이상 R 이하인가
:return: boolean 타입으로 반환한다.
"""
global L, R
if L <= abs(arr[y][x] - arr[ny][nx]) <= R:
return True
else:
return False
def BFS(x,y)-> None:
"""
하나로 이어진 부분을 찾는다.
:return:
"""
q=deque()
q.append((x,y))
v[y][x] = 1
dy = [-1,1,0,0]
dx = [0,0,-1,1]
while q:
x, y = q.popleft()
for i in range(4):
ny = y + dy[i]
nx = x + dx[i]
if ny< N and nx < N and nx >= 0 and ny >= 0 and not v[ny][nx] and check(ny,nx,y,x):
v[ny][nx] = 1
q.append((nx,ny))
flag = 0 # 아무런 값이 바뀌지 않은 것이 초기 값
tot = 0
cnt = 0
for j in range(N):
for i in range(N):
if v[j][i] == 1:
tot += arr[j][i]
cnt += 1
avg = int(tot / cnt)
for j in range(N):
for i in range(N):
if v[j][i] == 1 and arr[j][i] != avg:
arr[j][i] = avg
flag = 1
return flag
flag = 1
while flag: # 더 이상 값이 변경되지 않을 때까지 작업을 계속 해준다.
cnt = 0
ret = 0
v = [[0] * N for _ in range(N)]
for j in range(N):
for i in range(N):
if not v[j][i]: # 방문한 곳이 아니라면 BFS를 시작하자.
ret = max(BFS(i,j),ret) ## 좌상단에서부터 우측으로 BFS를 탐색하기 시작하자.
# 이 작업이 모두 끝났다면 1일차에 있는 인구이동이 마무리 되는 것이다.
flag = 1 if ret == 1 else 0
cnt += 1
print(cnt)
sum
에 담고 cnt
에 숫자를 담아서 O(n)from collections import deque
N, L, R = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(N)]
def check(ny, nx, y, x):
"""
this 와 there 의 차이가 L 이상 R 이하인가
:return: boolean 타입으로 반환한다.
"""
global L, R
if L <= abs(arr[y][x] - arr[ny][nx]) <= R:
return True
else:
return False
def BFS(x, y) -> None:
"""
하나로 이어진 부분을 찾는다.
:return:
"""
q = deque()
q.append((x, y))
united = []
v[y][x] = 1
dy = [-1, 1, 0, 0]
dx = [0, 0, -1, 1]
tot = arr[y][x]
cnt = 1
while q:
x, y = q.popleft()
united.append([x, y]) # 연합국들을 여기에 저장해둔다. for 문 최소화하기 위해서.
# 연합국들은 다음 round에서는 조사할 필요가 없다. 연합국들은 주변국들에 의해서만 병합될 뿐이기 때문이다.
for i in range(4):
ny = y + dy[i]
nx = x + dx[i]
if ny < N and nx < N and nx >= 0 and ny >= 0 and check(ny, nx, y, x) and not v[ny][nx]:
v[ny][nx] = 1
q.append((nx, ny))
tot += arr[ny][nx]
cnt += 1
flag = 0
if cnt > 1: # 연합국이 두개 이상이라면
flag = 1
avg = int(tot / cnt)
# 인구이동 여기서 시켜버림
for u in united:
x,y=u
arr[y][x] = avg
return flag
flag = 1
ans = 0
while flag:
ret = 0
v = [[0] * N for _ in range(N)]
for j in range(N):
for i in range(N):
if not v[j][i]:
ret = max(BFS(i, j), ret)
flag = 1 if ret == 1 else 0
if flag:
ans += 1
print(ans)