[백준] 16234 : 인구 이동

이상훈·2023년 8월 17일
1

알고리즘

목록 보기
15/57
post-thumbnail

인구 이동

풀이

  BFS, DFS 모두 가능하다고 생각했고 DFS를 활용했다. N*N 그래프를 2중 반복문을 통해 탐색하면서 각각의 지점에서 주어진 조건(인구 이동)에 맞게 DFS 탐색하면된다. 주어진 조건을 만족하면 리스트에 각 지점의 좌표를 저장한다음 dfs가 끝나면 리스트에 저장된 정보들을 토대로 초기화 작업을 진행하면 된다.

import sys
sys.setrecursionlimit(100000)

n, L, R = map(int, input().split())
maps = [list(map(int, input().split())) for _ in range(n)]

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


def dfs(x, y):
    for i in range(4):
        new_x = x + dx[i]
        new_y = y + dy[i]

        if 0 <= new_x < n and 0 <= new_y < n and visited[new_x][new_y]==0:
            temp = abs(maps[x][y] - maps[new_x][new_y])
            if L <= temp <= R:
                visited[new_x][new_y] = 1
                stack.append([new_x, new_y])
                dfs(new_x, new_y)


while True:
    visited = [[0] * n for _ in range(n)]
    flag = True
    for i in range(n):
        for j in range(n):
            stack = []

            if visited[i][j] == 0:
                stack.append([i, j])
                visited[i][j] = 1
                dfs(i, j)

                if len(stack) > 1:
                    flag = False
                    avg = sum([maps[x][y] for x, y in stack]) // len(stack)
                    for x, y in stack:
                        maps[x][y] = avg

    if flag:
        break

    count += 1

print(count)

시간복잡도 : O(n^4)

profile
Problem Solving과 기술적 의사결정을 중요시합니다.

0개의 댓글