Algorithm/acmicpc.net

오랜만에 만나 날 당황시키는 이분탐색 (실버3)

winney916 2022. 2. 25. 09:35
728x90

#1654번 랜선 자르기 https://www.acmicpc.net/problem/1654

 

1654번: 랜선 자르기

첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그

www.acmicpc.net

 

이분탐색이란 눈치를 채고 바로 풀었다

 

틀린코드

K, N = map(int, input().split())
lans = [int(input()) for _ in range(K)]

start = 1
end = min(lans)
while start <= end:
    mid = (start + end)//2
    pivot = sum(map(lambda x: x//mid, lans))
    if pivot == N:
        print(mid)
        break
    elif pivot > N:
        start = mid + 1
    elif pivot < N:
        end = mid - 1

바로 틀리길래 뭘 잘못했나 싶었다.

 

문제점

1. end 초깃값을 최솟값으로 설정했다. 최댓값으로 설정해야 빠짐없이 탐색할 수 있다. 

2. 이진탐색 내부에서의 논리문제였는데, 위의 형태에서는 답이 출력되지 않는 경우가 생긴다.

때문에 if문의 구조를 변경해야한다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

정답코드

K, N = map(int, input().split())
lans = [int(input()) for _ in range(K)]

start = 1
end = max(lans)
while start <= end:
    mid = (start + end)//2
    pivot = sum(map(lambda x: x//mid, lans))
    if pivot >= N:
        start = mid + 1
    elif pivot < N:
        end = mid - 1
print(end)