반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- express mongodb
- 장애물인식프로그램 파이썬
- 1987파이썬
- 파이썬 평범한배낭
- 백준 평범한배낭
- 백준 A->B
- 소프티어 장애물인식프로그램
- 백준
- 금고털이 파이썬
- MySQL완전삭제
- 등수매기기 파이썬
- 백준 예산
- express
- 백준 바이러스
- 백준 전쟁 파이썬
- 피아노체조 파이썬
- 백준 피아노체조
- 프로그래머스
- 백준 전쟁-전투
- MongoDB
- 소프티어 지도자동구축
- 백준 점프 파이썬
- CRUD
- 백준알파벳파이썬
- 파이썬데이터분석라이브러리
- 도커 컨테이너
- 백준 등수매기기
- jenkins
- 지도자동구축 파이썬
- 백준 점프
Archives
- Today
- Total
바위 뚫는중
[BOJ] 백준 16234. 인구 이동 (파이썬) 본문
반응형
🥇 인구 이동
https://www.acmicpc.net/problem/16234
💡 아이디어
- 인접한 나라의 국경선을 열지 말지 탐색을 이용해서 구한다
- 국경선을 열 경우, 연합 배열에 해당 좌표를 넣어준다
- 열어진 국경선의 총 합을 토대로 각 연합의 인구수 / 연합의 크기를 계산하여 연합 배열에 속한 각 칸의 인구수를 재설정 해준다.
- 인접한 나라 탐색이 끝날때 마다 날짜를 +1 해준다
📂 풀이
# 인구이동
from collections import deque
import sys
input = sys.stdin.readline
# 인구이동을 위해 인접한 나라를 탐색
def bfs(x,y,l,r):
q = deque()
q.append([x,y])
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
visited[x][y] = True
union = [[x,y]] # 연합에 속한 나라 좌표
while q:
x, y = q.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0<=nx<n and 0<=ny<n and not visited[nx][ny]:
# 인접한 나라와의 인구 수 차이가 l이상 r이하여야 함
if l <= abs(graph[nx][ny] - graph[x][y]) <= r:
visited[nx][ny] = True
q.append([nx,ny])
union.append([nx,ny]) # 연합에 추가
if len(union) > 1:
# union안의 좌표를 바탕으로 인구수 모두 더해주기
avg_pop = sum([graph[cx][cy] for cx,cy in union]) // len(union)
for cx, cy in union: # 연합안의 모든 좌표를 평균 인구수로 바꿔준다
graph[cx][cy] = avg_pop
return union # 연합 반환
else:
return []
# 메인
n, l, r = map(int, input().split())
graph = []
visited = [[False] * n for _ in range(n)] # 방문체크 배열
team = 0 # 연합의 개수
tmp_sum = 0 # 인구수
day = 0 # 날짜
# 연합 배열
for i in range(n):
graph.append(list(map(int, input().split())))
# 탐색 시작
while True:
visited = [[False] * n for _ in range(n)] # 방문체크 배열
moved = False # 인구 이동 확인
for i in range(n):
for j in range(n):
if not visited[i][j]:
union = bfs(i,j,l,r)
if union : # 연합이 있다면?
moved = True # 인구 이동됨
if not moved: # 인구가 이동하지 않았다면
break # 반복문 탈출
# 인구가 이동할 경우 더이상 이동 못할때 까지 반복, day += 1
day += 1
print(day)
⚠️ 느낀점
BFS 코드 짜는 것 보다 더 어려웠던 것은,,
인구 이동을 확인하는 변수와 연합 배열을 활용해서
한 번이라도 연합이 있었다면, 더 이상 이동이 불가할 때 까지 반복하고 날짜를 +1 해주고
연합이 없다면 break를 해주는 이 부분이 제일 어려웠다.
# 탐색 시작
while True:
visited = [[False] * n for _ in range(n)] # 방문체크 배열
moved = False # 인구 이동 확인
for i in range(n):
for j in range(n):
if not visited[i][j]:
union = bfs(i,j,l,r)
if union : # 연합이 있다면?
moved = True # 인구 이동됨
if not moved: # 인구가 이동하지 않았다면
break # 반복문 탈출
# 인구가 이동할 경우 더이상 이동 못할때 까지 반복, day += 1
day += 1
print(day)
반응형
'Algorithms > 백준' 카테고리의 다른 글
[BOJ] 백준 1987. 알파벳 - DFS, 백트래킹 (2) | 2024.03.08 |
---|---|
[Python] 냅색 알고리즘 (Knapsack Problem), 백준 12865. 평범한 배낭 (0) | 2024.02.29 |
[BOJ] 백준 11727. 2×n 타일링 2 (1) | 2024.02.27 |
[BOJ] 백준 2512. 예산 (1) | 2024.02.15 |
[BOJ] 백준 16953. A→B (1) | 2024.02.15 |