백준 16234 인구이동

문학적인유사성·2024년 3월 24일
0

language

목록 보기
16/24
post-thumbnail

백준 인구이동 문제
단순한 BFS문제와 동일하다.

  1. 조건을 만족하는 모든 국경선을 열어야하는 union을 만들기 ( BFS )
  2. union을 만들어서 좌표값을 넣기
  3. 해당 좌표값을 토대로 avg를 구하기
  4. 인구이동 (avg를 원래 좌표에 값 설정)
  5. 인구 이동이 없을 때 까지 반복
import sys
from collections import deque

n, l, r = map(int, sys.stdin.readline().split())
graph = []
for _ in range(n):
    graph.append(list(map(int, sys.stdin.readline().split())))

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

def bfs(a, b):
    queue = deque()
    union = []
    queue.append((a,b))
    union.append((a,b))

    while queue:
        y, x = queue.popleft()
        for k in range(4):
            ny = y + dy[k]
            nx = x + dx[k]
            if 0<=nx<n and 0<=ny<n and visited[ny][nx]==0:
                if l<=abs(graph[ny][nx]-graph[y][x])<=r:
                    visited[ny][nx]=1
                    queue.append((ny,nx))
                    union.append((ny,nx))
                    
    return union

result =0
while True:
    visited = [[0 for _ in range(n)] for _ in range(n)]
    flag = 0
    for i in range(n):
        for j in range(n):
            if visited[i][j]==0:
                visited[i][j]=1
                set_union = bfs(i, j)
                
                if len(set_union) > 1:
                    flag=1
                    # //를 사용하면 소수점 이하를 버림, /를 사용하면 부동 소수점 결과를 얻음.
                    # 해당 부분을 몰라서 한참 헤맸다..ㅠㅠ
                    avg = sum(graph[y][x] for y,x in set_union) // len(set_union)
                    for y,x in set_union:
                        graph[y][x] = avg
    if flag==0:
        break
    result+=1
print(result)

부동소수점 까지 넣어주었더니, 계속 오류가 생겨서....
문제를 더욱더 제대로 읽자...

profile
Are you nervous? Don't be

0개의 댓글