-
[Python] 백준 18513 샘터알고리즘/문제풀이 2021. 7. 31. 18:35728x90
1. 문제 링크
https://www.acmicpc.net/problem/18513
18513번: 샘터
첫째 줄에 자연수 N과 K가 공백을 기준으로 구분되어 주어진다. (1 ≤ N, K ≤ 100,000) 둘째 줄에 N개의 샘터의 위치가 공백을 기준으로 구분되어 정수 형태로 주어진다. (-100,000,000 ≤ 샘터의 위치 ≤
www.acmicpc.net
2. 문제 요약
- 모든 집에 대한 불행도의 합의 최솟값 구하기
3. 아이디어 정리
샘터를 기준으로 불행도를 늘려주면서 bfs를 진행한다.
- 샘터를 기준으로 시작하기 위해 큐에 넣어준다.
- -1, + 1 위치 방향으로 bfs 진행
- 해당 집 위치를 큐에 넣기 - (집 위치, 현재 불행도 + 1)
4. 문제 풀이
4-1. 내 풀이
import sys from collections import deque n, k = map(int, sys.stdin.readline().split()) # 샘터 수, k채 집 n_list = list(map(int, sys.stdin.readline().split())) # 샘터 위치 visit = set() dq = deque() # 1. 샘터를 기준으로 시작하기 위해 큐에 넣어준다. for i in n_list: dq.append((i, 1)) # 위치, 불행도 visit.add(i) # 방문 체크 # 2. -1, + 1 위치 방향으로 bfs 진행 result = 0 # 불행도의 합 최솟값 now_build = 0 # 현재까지 지어진 집 수 while dq: now, b = dq.popleft() # 위치, 불행도 for d in [1, -1]: nx = now + d # 새로 지은 집 위치 if nx in visit: # 방문 여부 체크 continue visit.add(nx) # 방문 체크 result += b # 결과에 불행도 증가 now_build += 1 # 지어진 집 수 + 1 dq.append((nx, b + 1)) # 집 위치, 집에 대한 불행도 + 1 if now_build == k: dq = list() break print(result)
5. 결론
- 생각보다 어려웠던 일차원 bfs
반응형'알고리즘 > 문제풀이' 카테고리의 다른 글
[Python] 백준 14719 빗물 (0) 2021.08.07 [Python] 백준 16234 인구 이동 (0) 2021.08.07 [Python] 백준 10159 저울 (0) 2021.07.31 [Python] 백준 14466 소가 길을 건너간 이유 6 (0) 2021.07.24 [Python] Programmers 행렬 테두리 회전하기 (0) 2021.07.24