https://www.acmicpc.net/problem/2110
SOLUTION
이분탐색으로 풀 수 있는 문제다.
이분탐색에 대한 정의를 알고 오길 추천한다. (https://claude-u.tistory.com/267)
공유기 설치 길이를 움직여(이분탐색하여) 적절한 집에 설치 가능한지 살펴보는 문제다.
1) 거리가 주어지면, 해당 라우터를 몇 개 설치할 수 있는지 산출하는 router_counter 함수를 정의한다.
2) 첫 집을 start로, 첫 집과 끝집의 차이를 end로 둔다.
3-1) 해당 거리로 충분한 설치 장소를 찾지 못했다면 거리를 줄여주고
3-2) 설치된 집이 더 많다면 거리를 늘려준다.
PYTHON CODE
import sys
N, C = map(int, (input().split()))
house = [int(sys.stdin.readline()) for _ in range(N)]
#해당 거리를 유지하며 공유기가 몇 개 설치될 수 있는가?
def router_counter(distance):
count = 1
cur_house = house[0] #시작점
for i in range(1, N): #집모두를 돈다
if cur_house + distance <= house[i]: #이전 집에서 해당 거리보다 멀리 떨어진 집이라면
count += 1
cur_house = house[i] #공유기 설치된 집 갱신
return count
house = sorted(house) #이분탐색을 위한 정렬
start, end = 1, house[-1] - house[0] #1, 첫집과 끝집
while start <= end: #이분탐색 알고리즘
mid = (start+end) // 2
if router_counter(mid) >= C:
answer = mid
start = mid + 1
else:
end = mid - 1
print(answer)
'Programming [Python] > 백준 알고리즘 솔루션' 카테고리의 다른 글
#397 백준 파이썬 [2991] 사나운 개 (0) | 2020.02.13 |
---|---|
#396 백준 파이썬 [1300] K번째 수 - 이분탐색 (0) | 2020.02.11 |
#394 백준 파이썬 [2512] 예산 - 이분탐색 (2) | 2020.02.10 |
#393 백준 파이썬 [2805] 나무 자르기 - 이분탐색 (0) | 2020.02.10 |
#392 백준 파이썬 [7579] 앱 - 냅색 알고리즘 (0) | 2020.02.04 |