[BOJ_Python] 1654. 랜선 자르기
2024. 11. 21. 23:47ㆍ[Algorithm]/문제 풀이
문제
https://www.acmicpc.net/problem/1654
사용 알고리즘
이분탐색
풀이
고려사항
1. N개 이상을 만들 수 있는 '최대' 길이인지
후기
1. 이분탐색의 기본 유형이다.
이분 탐색을 통해 랜선을 자를 길이를 계속 좁혀가며 탐색한다.
- 가능한 랜선의 길이는 1 ~ ($2^{31}$ - 1)으로 단순 모든 길이를 확인하면 약 $2^{31}$ 번 연산이 필요하다.
- 이진 탐색의 경우 $log_{2} {(max cable)}$으로 설정 후 K만큼 랜선 갯수 연산을 진행한다.
따라서 시간 복잡도는 $O(K log_{2} {(max cable)}) $로 효율적이다.
코드흐름
1. 기준 길이를 통해 N개 이상의 랜선이 만들어 질 수 있는지 확인한다.
- N개 이상이 가능하다면, 기준 길이를 높인다.
- N개 이상이 가능하지 않다면, 기준 길이를 낮춘다.
2. 위의 탐색을 계속 진행하다가 start와 end가 최종 만나는 지점을 찾아 출력한다.
코드
import sys
input = sys.stdin.readline
N, K = map(int, input().split())
cable = [int(input()) for _ in range(N)]
start, end = 1, max(cable)
result = 0
while start <= end:
mid = (start + end) // 2
cnt = 0
for i in cable:
cnt += i // mid
if cnt >= K:
start = mid + 1
result = mid
else:
end = mid - 1
print(result)
결과
'[Algorithm] > 문제 풀이' 카테고리의 다른 글
[BOJ_Python] 1309.동물원 (0) | 2024.11.23 |
---|---|
[BOJ_Python] 2110.공유기 설치 (0) | 2024.11.22 |
[BOJ_Python] 1920. 수 찾기 (2) | 2024.11.20 |
[BOJ_Python] 11286. 절댓값 힙 (0) | 2024.11.19 |
[BOJ_Python] 2108.통계학 (4) | 2024.11.18 |