사용한 자료구조 및 개념 : 이분 탐색 (Binary Search)
💡 문제풀이 아이디어 및 어려웠던 점
💫 아이디어
가능한 최대 길이를 효율적으로 찾기 위해 이분 탐색(Binary Search) 을 사용하였습니다.
🤓 문제 풀이 단계
1️⃣ 입력 받기 및 초기 설정
- 랜선의 개수 k와 필요한 랜선의 수 n을 입력받습니다.
- 이어서 각 랜선의 길이를 입력 받아 cables 리스트에 저장합니다.
- 이분 탐색을 위한 시작점 start를 1로, 종료점 end를 주어진 랜선들 중 최대 길이로 초기화합니다.
2️⃣ 이분 탐색을 통한 최대 길이 탐색
- while start <= end: 반복문을 통해 이분 탐색을 수행합니다.
- 중간 길이 mid를 계산하고 이 길이로 자를 수 있는 랜선의 개수 cnt를 구합니다.
- 만약 cnt가 목표치 n 이상이면 해당 길이 mid는 조건을 만족하므로 정답(ans)을 갱신하고 더 긴 길이를 찾기 위해 start를 늘립니다.
- 그렇지 않으면 길이를 줄이기 위해 end를 감소시킵니다.
3️⃣ 최종 결과 출력
- 이분 탐색이 완료되면 ans에는 n개의 랜선을 만들 수 있는 최대 길이가 저장되어 있습니다.
✅ 세부 구현 포인트 및 이점
- 이분 탐색(Binary Search):
- 이분 탐색을 사용함으로써 가능한 길이의 범위를 매번 절반으로 줄여가며 답을 찾습니다.
- 이로 인해 전체 탐색 시간을 O(log M)으로 줄일 수 있어 랜선 길이의 최대값이 매우 클 때도 효율적으로 처리할 수 있습니다.
- 탐색 범위 설정:
- start를 1로 end를 주어진 랜선들 중 최대 길이로 설정하여 초기 범위를 정합니다.
(start값이 1인 이유는 랜선을 자를 수 있는 최소 값이 1이기 때문입니다.) - 가능한 랜선 길이의 최대 범위 내에서 조건을 만족하는 최대 값을 찾습니다.
- start를 1로 end를 주어진 랜선들 중 최대 길이로 설정하여 초기 범위를 정합니다.
- 최적화:
- 각 단계에서 cnt를 계산하면서 현재 길이 mid로 충분한 랜선을 만들 수 있는지 확인합니다.
- 이 과정을 통해 불필요한 길이 검사는 최소화하고 탐색 범위를 빠르게 줄여갑니다.
Solution Code
k, n = map(int, input().split())
cables = [int(input()) for _ in range(k)]
start, end = 1, max(cables)
ans = 0
while start <= end:
mid = (start + end) // 2
cnt = 0
for cable in cables:
cnt += cable // mid
if cnt >= n:
ans = mid
start = mid + 1
else:
end = mid - 1
print(ans)
'💡Algorithm > python' 카테고리의 다른 글
[python]2470_두 용액 (0) | 2025.01.17 |
---|---|
[python]2776_암기왕 (0) | 2025.01.13 |
[python]1012_유기농 배추 (0) | 2023.10.08 |
[python]13023_ABCDE (0) | 2023.09.29 |
[python]2668_숫자고르기 (0) | 2023.09.27 |