본문 바로가기
코딩테스트/이진 탐색

[python] 백준 14567번: 선수과목

by brown_board 2023. 1. 6.
728x90

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

 

1654번: 랜선 자르기

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

www.acmicpc.net

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import sys
 
def binary_search(array,target,start,end):
    while start <= end:
        cnt = 0
        mid = (start+end)//2
        for i in range(len(array)):
            cnt += array[i] // mid
        
        #중간점의 값보다 찾고자 하는 값이 작은 경우 (중간점을 왼쪽으로 옮기기)
        if cnt < target:
            end = mid - 1
        #중간점의 값보다 찾고자 하는 값이 큰 경우(중간점을 오른쪽으로 옮기기)
        else :
            start = mid + 1
    return end
 
#sys.stdin = open("input1.txt",'r')
input=sys.stdin.readline
 
k,n = map(int,input().split())
array=[]
for i in range(k):
    array.append(int(input()))
print(binary_search(array,n,1,max(array)))
cs

이는 이진 탐색으로 풀어야 합니다.
mid값을 중심으로 start,end값을 바꿔서 시간복잡도를 O(logN)으로 풀어야 시간초과가 안납니다.
이는 start와 end값을 mid 근처값으로 초기화가 되기 때문에 처음 array값을 전부 완전 탐색하는 것이 아닌 이진 탐색하게 됩니다. 그렇기 때문에 길이 자르기라던가 탐색을 해야하는 경우가 생길 때는 이와 같이 이진탐색을 사용하여 시간초과가 안나도록 해야합니다.

728x90

댓글