알고리즘/백준[baekjoon]

[baekjoon]백준 1654번 : 랜선 자르기 (by python 파이썬) 이분탐색

코딩하는이씨 2022. 3. 30. 21:58
728x90
반응형

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

 

1654번: 랜선 자르기

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

www.acmicpc.net

 

code

import sys
input = sys.stdin.readline

k, n = map(int,input().split())
l = []
for i in range(k):
    lan = int(input())
    l.append(lan)

start, end = 1, max(l)

while start <= end:
    mid = (start+end)//2
    lines = 0
    for i in l:
        lines += i //mid
    if lines >= n:
        start = mid + 1
    else:
        end = mid - 1
    
print(end)

 

이번 문제는 이분 탐색을 활용하는 문제다.

 

이분 탐색을 사용하지 않고 순차 탐색을 한다면 시간초과에 걸리게 된다.

 

이분탐색은 탐색범위를 절반씩 줄여가며 탐색하기 때문에 시간복잡도 O(log n) 으로 끝낼수 있다.

 

 

이분탐색의 구현 방법은 간단하다.

1. mid값(중앙값)을 찾는다.

2. mid값과 원하는 값과 비교한다.

3. 원하는 값이 나올때 까지 반복한다.

(원하는 값보다 크면 start를 mid +1로 옮기고,

원하는 값보다 작으면 end 를 mid -1로 옮긴다)

728x90
반응형