1654-s2 성공
This commit is contained in:
47
1654-s2.py
Normal file
47
1654-s2.py
Normal 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로 했다.
|
||||
"""
|
||||
Reference in New Issue
Block a user