본문 바로가기
코딩 테스트/DFS, BFS

인구 이동

by hazel_ 2021. 2. 3.

p.353

 

python3로 하니까 시간초과

pypy3로 함

import sys
from collections import deque
input=sys.stdin.readline

n,l,r=map(int, input().split())
A=[]
for i in range(n):
  A.append(list(map(int, input().split())))

dx=[-1,1,0,0]
dy=[0,0,-1,1]

day_cnt=0 # day count

while True: # 더이상 연합이 만들어지지 않을 때까지
  uni_flag=0 # 연합이 만들어졌는지 체크
  day_visit=[[0]*n for _ in range(n)] # 방문한 나라 체크 (하루마다 초기화)

  for i in range(n):
    for j in range(n):  # 한 나라씩 돌며
      if day_visit[i][j]==0: # 오늘 그 나라에 방문한 적이 없다면
        queue=deque()
        uni=[] # 연합 국가 
        people_sum=0 # 연합 국가 총 인구수

        queue.append((i,j))
        day_visit[i][j]=1
        uni.append((i,j))
        people_sum+=A[i][j]

        while queue: # 연합할 수 있는 국가가 없을때까지
          x,y=queue.popleft()
          
          for d in range(4):
            nx=x+dx[d]
            ny=y+dy[d]
            if nx>=0 and ny>=0 and nx<n and ny<n: # 맵 범위 안
              if day_visit[nx][ny]==0 and (abs(A[x][y]-A[nx][ny])<=r) and (abs(A[x][y]-A[nx][ny])>=l): # 연합 조건에 만족하면
                queue.append((nx,ny))
                day_visit[nx][ny]=1
                uni.append((nx,ny))
                people_sum+=A[nx][ny]
                uni_flag=1
        
        uni_people=int(people_sum/len(uni))
        for ux,uy in uni:
          A[ux][uy]=uni_people

  if uni_flag==0: # 만들어진 연합이 없다.
    break
  else:
    day_cnt+=1

print(day_cnt)

'코딩 테스트 > DFS, BFS' 카테고리의 다른 글

블록 이동하기  (0) 2021.02.05
감시 피하기  (0) 2021.01.31
연산자 끼워넣기  (0) 2021.01.31
괄호 변환  (0) 2021.01.29
경쟁적 전염  (0) 2021.01.27

댓글