[BOJ] 16234 인구 이동_BFS
Date:
인구 이동
내 풀이
- 방식 : DFS, DP
- Pypy3
📰code
from collections import deque
N,L,R = list(map(int,input().split()))
A = []
for i in range(N):
A += list(map(int,input().split()))
move = ((-1,0),(1,0),(0,-1),(0,1))
c = 0
while True :
s = [[i,1] for i in A] # 연합의 합, 연합 지역의 수
a = [-1 for _ in range(N*N)] # 연합 Map
stopper = True
x,y = 0,0
a[0] = 0
q = deque()
q.append((x,y))
while q:
x,y = q.popleft() # 시작좌표, 영역 구분
u = a[x*N+y]
for dx,dy in move:
if 0<=x+dx<N and 0<=y+dy<N:
mx,my = x+dx, y+dy
if a[mx*N+my] == -1:
a[mx*N+my] = mx*N+my
q.append((mx,my))
elif L<=abs(A[mx*N+my]-A[x*N+y])<=R: # 차이값이 L, R 사이인 경우
stopper = False
if u == a[mx*N+my]:
continue
else :
min_u, max_u = min(a[mx*N+my],u),max(a[mx*N+my],u)
s[min_u][0] += s[max_u][0]
s[min_u][1] += s[max_u][1]
s[max_u] = [0,0]
a = [min_u if i==max_u else i for i in a]
q.append((mx,my))
if stopper:
print(c)
break
else : c+=1
A = [s[i][0]//s[i][1] if s[i][1]!=0 else 0 for i in a]
다른 풀이
- 방식 : DFS, DP
📰code
from collections import deque
import sys
input = sys.stdin.readline
def bfs(c,A):
x,y = c//N,c%N
q = deque()
q.append((x,y))
popul = A[x*N+y]
area = [x*N+y]
while q:
x,y = q.popleft() # 시작좌표, 영역 구분
for dx,dy in move:
if 0<=x+dx<N and 0<=y+dy<N :
mx,my = x+dx, y+dy
if L<=abs(A[mx*N+my]-A[x*N+y])<=R and visited[mx*N+my] != cnt:
visited[mx*N+my] = cnt
popul += A[mx*N+my]
area.append(mx*N+my)
q.append((mx,my))
return area, popul
N,L,R = list(map(int,input().split()))
A = []
for i in range(N):
A += list(map(int,input().split()))
move = ((-1,0),(1,0),(0,-1),(0,1))
visited = [-1 for _ in range(N*N)]
check = deque([(i) for i in range(N*N)])
cnt = 0
while True:
for _ in range(len(check)):
c = check.popleft()
if visited[c] == cnt:
continue
visited[c] = cnt
area,popul = bfs(c,A)
if len(area)>1:
popul = popul//len(area)
for a in area:
A[a]=popul
check.append(a)
if check:
cnt +=1
else :
print(cnt)
break
💡 수정 필요한 내용은 댓글이나 메일로 알려주시면 감사하겠습니다!💡
댓글