파이썬으로 부시자! Python with Coreenee

백준-이분탐색(2110 공유기 설치)

문제

스크린샷 2020-07-10 오후 10 20 14

입력

스크린샷 2020-07-10 오후 10 20 22


문제 해설

이분탐색인지 재귀인지 헷갈리는 문제였다… 당연히 이분탐색으로밖에 못푸는 입력 범위였다. key 아이디어는 집이 있는 좌표를 정렬하는 것과 하한/상한값의 mid값을 통해서 처음 집부터 출발하여 mid값과 다음 집까지의 거리를 비교하면서 공유기의 갯수를 세주는 것이다. 코드는 다음과 같다.

N, C = list(map(int, input().split()))
home_list = [int(input()) for _ in range(N)]
home_list.sort()

#공유기2개 설치할 때는 양쪽으로 설치하는게 제일 멈
if C == 2:
    print(home_list[-1]-home_list[0])
#공유기3개 이상일 때
else:
    #상한/하한값
    left_value = 1
    right_value = home_list[-1]-home_list[0]
    #이분탐색 시작
    while True:
        mid = (left_value+right_value)//2
        cnt = 0
        start_idx = 0
        flag = 0
        while True:
            #현재 집과 다음집의 거리를 mid값과 비교해준다.
            for i in range(start_idx+1, N):
                diff = home_list[i] - home_list[start_idx]
                if diff >= mid:
                    cnt += 1
                    start_idx = i
                    break
                elif diff < mid and i == N-1:
                    start_idx = i
                    flag = 1
                    break
            if cnt ==0 or flag == 1:
                break
        if cnt + 1 < C:
            right_value = mid
        else: 
            left_value = mid
        
        if right_value-left_value == 1:
            break
    
    print(left_value)

문제를 풀 때 당황해하지 않고 푸는게 가장 중요하다. 풀기전에 문제에 대한 아이디에이션과 메모가 중요하다. 머릿속으로 하려니깐 잦은 실수가 발생한다ㅜ