이번 문제는 삼성 기출 문제로 BFS를 통해 개방할 수 있는 국경선들을 모두 체크하고, 현재 위치의 나라와 연결된 모든 나라들을 구하여 그 나라들의 인구수를 평균값으로 갱신해준다. 이 과정을 거치기 전의 전체 나라들의 인구 상황을 저장하고, 이 과정을 거친 후의 인구 상황과 비교하여 둘이 같을 때가지 반복하여 진행하였다.
(sy, sx)
를 넣는다.visited[sy][sx]
를 1로 갱신한다.ground[sy][sx]
로 선언한다.y+dy[i]
, x+dx[i]
로 선언한다.visited[ny][nx]
가 0이고, ground[y][x]-ground[ny][nx]
의 절댓값이 l 이상, r 이하일 경우,visited[ny][nx]
를 1로 갱신한다.ground[ny][nx]
를 더한다.(ny, nx)
를 넣는다.(ny, nx)
를 넣는다.ground[i][j]
를 total//len(cnt)
로 갱신한다.n*n
크기로 선언하고 0으로 채운다.visited[i][j]
가 0일 경우,bfs(i, j)
를 호출한다.from collections import deque
from copy import deepcopy
n, l, r=map(int, input().split())
ground=[list(map(int, input().split())) for _ in range(n)]
dy, dx=[1, 0, -1, 0], [0, 1, 0, -1]
def bfs(sy, sx):
q=deque()
q.append((sy, sx))
visited[sy][sx]=1
total=ground[sy][sx]
cnt=[(sy, sx)]
while q:
y, x=q.popleft()
for i in range(4):
ny, nx=y+dy[i], x+dx[i]
if 0<=ny<n and 0<=nx<n and not visited[ny][nx] and l<=abs(ground[y][x]-ground[ny][nx])<=r:
visited[ny][nx]=1
total+=ground[ny][nx]
cnt.append((ny, nx))
q.append((ny, nx))
for i, j in cnt:
ground[i][j]=total//len(cnt)
answer=0
while True:
tmp=deepcopy(ground)
visited = [[0 for _ in range(n)] for _ in range(n)]
for i in range(n):
for j in range(n):
if not visited[i][j]:
bfs(i, j)
if tmp!=ground:
answer+=1
else:
break
print(answer)