코딩 연습/Python

섹션4: 이분탐색(결정알고리즘)

썬2 2021. 11. 14. 22:29

이분탐색 푸는 유형: 답이 특정 범위 안에 알고 있을 때, 범위 좁히면서 찾는다.

 

2번: 랜선자르기

n개의 랜선 길이가 k개의 랜선 길이를 넘지 않는 것이 확실. -> 1 ~ 1000

중간값인 500이 답이 되는지 확인 -> 500은 답이 아님. 그럼 500보다 작은 쪽으로 감. -> 1 ~ 499

중간값인 250이 답이 되는지 확인 -> 11개 이상인데 8개밖에 나오지 않아서 답이 아님. -> 1 ~ 249

중간값인 125가 답이 되는지 확인 -> 18개가 나와서 답이 가능. -> 125이하는 답이 다 되므로 126 ~ 249에서 답이 있는지 확인.

... 이런식으로 이분검색이 끝날 때까지 한다.

lt = 1
rt = largest
while lt <= rt:
    mid = (lt + rt) // 2 # 한 개의 랜선 길이 (답)
    if Count(mid) >= n: # 답이 되는 경우
        res = mid
        lt = mid + 1 # 더 좋은 답을 찾아서 나아가기
    else: # 개수가 부족하여 답이 되지 않는 경우
        rt = mid - 1 # 긴쪽 버리기

 

3번: 뮤직비디오

비디오의 용량은 어떤 노래들보다 용량이 많다는 하에 진행이 됨을 기억하자.

 

4번: 마구간 정하기

lt, rt 범위를 두 말의 최대 거리로 두기.

lt 최소: 1.  rt 최대: 9. mid = (9+1)//2 = 5

첫번째 마구간 좌표에는 무조건 말을 넣기.

두번째 마구간 좌표하고의 거리를 구하기. (2-1) < 5 -> 배치 못함.

세번째 마구간 좌표하고의 거리를 구하기. (4-1) < 5 -> 배치 못함.

네번째 마구간 좌표하고의 거리를 구하기. (8-1) >= 5 -> 배치 함. +마지막 좌표: 8

다섯번째 마구간 좌표하고의 거리를 구하기. (9-8) < 5 -> 배치 못함.

5보다 긴것은 더 배치를 못해서 답이 안되니깐 rt=5-1로 바꾸기.

...이런식

만약 세마리 배치할수 있는데 네마리도 배치할수 있으면 답이 된다.

 

'거리 차'로 해야지 Time Error가 나지 않는다.