https://www.acmicpc.net/problem/16234
16234번: 인구 이동
N×N크기의 땅이 있고, 땅은 1×1개의 칸으로 나누어져 있다. 각각의 땅에는 나라가 하나씩 존재하며, r행 c열에 있는 나라에는 A[r][c]명이 살고 있다. 인접한 나라 사이에는 국경선이 존재한다. 모
www.acmicpc.net
'''
16234번: 인구 이동 / gold 5 / 구현, 시뮬레이션
'''
import sys
sys.setrecursionlimit(10**8)
input = sys.stdin.readline
dx = [0, 0, -1, 1]
dy = [-1, 1, 0, 0]
def dfs(x, y):
visited[x][y] = True
for i in range(4):
nx = dx[i] + x
ny = dy[i] + y
if 0 <= nx < N and 0 <= ny < N:
if not visited[nx][ny]:
if L <= abs(graph[x][y] - graph[nx][ny]) <= R:
graph_info.append([nx, ny])
graph_num.append(graph[nx][ny])
dfs(nx, ny)
# 입력받기
N, L, R = map(int, input().split())
graph = []
for _ in range(N):
graph.append(list(map(int, input().split())))
# 시뮬레이션
turn = 0
while True:
change_graph = False
visited = [[False for _ in range(N)] for _ in range(N)]
for x in range(N):
for y in range(N):
if not visited[x][y]:
# 현재 국가 graph[x][y] 와 국경개방 하는 나라 찾기
graph_info = [[x, y]]
graph_num = [graph[x][y]]
# dfs로 국경개방 나라 정보 담기
dfs(x, y)
if len(graph_num) >= 2:
change_graph = True
div_num = sum(graph_num) // len(graph_num)
for p, q in graph_info:
graph[p][q] = div_num
if not change_graph:
break
else:
turn += 1
print(turn)
코드 리뷰
- 해당 문제를 푸는데 약 70분 소요되었고, 정답 판정을 받았습니다.
- 처음에 구현 방식을 너무 디테일하게 설정해서 코드가 길어지다 보니 시간이 많이 소요되었습니다.
(처음 구현 방식)
1. 각 나라 국경선 (가로, 세로) 만들고 -> 둘이 개방해야 하는지 체크해서 국경선 정보 담기
2. 국경선 정보를 활용해서 그래프 변환 하기 / 이 부분에서 많이 고민하면서 빡 구현하다가 코드가 길어졌습니다.
결국 위 코드와 같이 수정을 했습니다.
'백준 문제풀이' 카테고리의 다른 글
17136번: 색종이 붙이기 / gold 2 / 백트래킹 (0) | 2023.06.26 |
---|---|
13023번: ABCDE / gold 5 / 백트래킹 (0) | 2023.06.20 |
14891번: 톱니바퀴 / gold 5 / 구현, 시뮬레이션 (0) | 2023.06.17 |
2583번: 영역 구하기 / silver 1 / DFS (0) | 2023.06.13 |
3085번: 사탕 게임 / silver 2 / 브루트포스 (0) | 2023.06.10 |