1654-s2 성공

This commit is contained in:
sm4640
2026-04-02 17:19:13 +09:00
parent fc2523e4ae
commit 32ec66e6a9

47
1654-s2.py Normal file
View File

@@ -0,0 +1,47 @@
# 랜선 자르기
import sys
input = sys.stdin.readline
def binary_search(l, r, lan_lst, target):
result = 0
while l <= r:
count = 0
mid = (l+r)//2
for lan in lan_lst:
count += (lan // mid)
if count >= target:
l = mid+1
result = mid
else:
r = mid-1
return result
def solution():
k, n = map(int, input().rstrip().split())
max_len = 0
lan_lst = [0] * k
for i in range(k):
lan_lst[i] = int(input().rstrip())
max_len = max(max_len, lan_lst[i])
result = binary_search(l=1, r=max_len+1, lan_lst=lan_lst, target=n)
print(result)
return
solution()
"""
걸린 시간: 1시간
시간 복잡도: 1부터 가장 큰 랜선 길이까지의 범위에서 이분탐색을 진행하므로 O(log(2^31-1))이고, 이분탐색을 할 때마다 k개의 랜선을 잘라보기 때문에 O(klogn)이다.
해설: 최대 길이를 찾는 것이기 때문에 주어진 랜선 중 가장 긴 길이부터 아래로 내려가면서 n개가 나오는 첫 지점을 찾으면 된다.
근데 이렇게 하면 랜선의 길이가 최대 2^31-1이므로 너무 오래 걸린다.
마침 수직선이기 때문에 이분탐색을 하면 되겠다는 생각을 했고, 이렇게 최적화 문제를 결정문제로 바꿔서 푸는 것을 파라메트릭 서치라고 한다.
이분 탐색 구현은 count가 n보다 크면 일단 답 후보로 넣어놓고, l을 mid+1로 옮겼고, 반대의 상황일 때는 답 후보로 넣지 않고, r을 mid-1로 했다.
"""