본문 바로가기
알고리즘 (Python)

랜선자르기 (결정알고리즘, 이분탐색)

by ppirae 2022. 3. 24.

인프런 김태원님의 파이썬 알고리즘 문제풀이를 듣고 작성한 글입니다.

https://inf.run/Uiep

 

파이썬 알고리즘 문제풀이 (코딩테스트 대비) - 인프런 | 강의

파이썬을 이용한 코딩테스트 문제풀이를 합니다., - 강의 소개 | 인프런...

www.inflearn.com

#내 풀이
k, n = map(int, input().split())
a = []
for i in range(k):
    a.append(int(input()))

start = max(a)//2

while True:
    cnt = 0
    for x in a:
        cnt += x//start
    if cnt == n:
        break
    elif cnt > n:
        start += 1
    else:
        start -= 1

print(start)

 

내 방식대로 문제를 풀어봤는데 채점 프로그램에서 시간초과가 발생했다.

그 이유는 start += 1, 또는 start -= 1을 하는 것이 아니라

이분 탐색으로 그 길이를 찾아야하는데 방법을 잘 모르겠어서 강의를 봤다.

 

#강의 풀이

def Count(len):
    cnt = 0
    for x in Line:
        cnt += (x//len)
    return cnt

k, n = map(int, input().split())
Line = []
res = 0
largest = 0
for i in range(k):
    tmp = (int(input()))
    Line.append(tmp)
    largest = max(largest, tmp)

lt = 1
rt = largest
while lt <= rt:
    mid = (lt+rt)//2
    if Count(mid) >= n:
        res = mid
        lt = mid + 1
    else:
        rt = mid - 1
print(res)

 

lt = 1, rt는 최대길이, mid는 중간지점을 해놓고

if Count(mid) >= n:

     res = mid

     lt = mid + 1

 

res에 mid를 저장하여 mid의 최댓값을 구하는 부분이 잘 생각이 안났었다.

'알고리즘 (Python)' 카테고리의 다른 글

회의실 배정(그리디)  (0) 2022.03.26
마구간 정하기 (결정알고리즘, 이분탐색)  (0) 2022.03.24
사과나무 (다이아몬드)  (0) 2022.03.23
수의 구간 합  (0) 2022.03.22
두 리스트 합치기  (0) 2022.03.22

댓글