본문 바로가기
Algorithm/BOJ

[백준] 1477번 - 휴게소 세우기 (파이썬)

by _temp 2022. 3. 30.

https://www.acmicpc.net/problem/1477

 

# 휴게소 세우기
N, M, L = map(int, input().split())
arr = [0]+list(map(int, input().split()))+[L]
arr.sort()

start, end = 1, L-1
result = 0
while start <= end:
    count = 0
    mid = (start+end) // 2
    for i in range(1, len(arr)):
        # 현재 거리 중 mid보다 큰 거리를 찾아서
        if arr[i]-arr[i-1] > mid:
            # 나눈 만큼 휴게소를 설치 (현재 설치 돼있는 구역은 제외해야해서 -1)
            count += (arr[i]-arr[i-1]-1)//mid
    if count > M:
        start = mid+1
    else:
        end = mid-1
        result = mid
print(result)

 

이분탐색
1. 입력을 받으면서 휴게소 배열(arr)의 양 끝에 출발지점과 도착지점을 추가해주고 정렬
2. start, end는 휴게소 위치의 범위
3. 이분탐색
    - mid : 가장 멀리 떨어져 있는 휴게소 사이 거리
    - count : 설치해야 할 휴게소 개수
    - 모든 거리를 완전 탐색을 해서 mid보다 큰 경우, 해당 mid로 나누어서 설치해야 할 휴게소 개수를 구한다.
    - 설치해야 할 휴게소 개수가 M보다 크다면 mid는 더 길어야 한다.
    - 설치해야 할 휴게소 개수가 M보다 작다면 mid는 더 짧아야 한다. (조건 만족은 했으므로 result = mid)
4. result 출력