본문 바로가기
코딩테스트 파이썬/백준

랜선 자르기 ( 1654 번 )

by 세용용용용 2026. 1. 1.

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

 


🧠 알고리즘

  • 이분 탐색 (Binary Search)

 

✔️ 동작 방식

[ 핵심 아이디어 ]

  • 랜선을 어떤 길이로 자를지(now_len) 를 기준으로
    그 길이로 N개 이상 만들 수 있는지 판단한다.
  • 가능한 길이 중 최댓값을 찾는 문제이므로
    조건을 만족하면 더 큰 길이 탐색,
    불만족하면 길이를 줄인다.

 

[ 로직 요약 ]

  • 가능한 랜선 길이의 범위를 l = 1, r = max(n_list)로 설정
  • now_len= (l + r) // 2 를 현재 자를 길이로 설정
  • 모든 랜선에 대해 랜선 길이 // now_len로 만들 수 있는 개수 합산
  • 개수가 n 이상이면 →  현재 길이는 가능 → answer 갱신 더 긴 길이 탐색 (l = mid + 1)
  • 부족하면 → 길이를 줄임 (r = mid - 1)
  • 탐색 종료 후 answer 출력

 

🧾 코드

import sys

def _main():
    l, r = 1, max(n_list)

    while l <= r:
        now_len = (l + r) // 2
        now_count = 0

        for n_value in n_list:
            now_count += (n_value // now_len)

        if now_count >= n:
            answer = now_len
            l = now_len + 1
        else:
            r = now_len - 1

    return answer
    

k, n = map(int, sys.stdin.readline().rstrip().split())
n_list = tuple(int(sys.stdin.readline().rstrip()) for _ in range(k))
print(_main())

 

⏱️ 시간 복잡도

while l <= r : 이분 탐색을 통한 최적의 길이 찾기 ( 로그 시간 )
    for n_value in n_list : 랜선을 순회하며 현재 갯수 구하기 ( 선형 시간 )

해당 알고리즘 시간 복잡도 : 선형 로그 시간 복잡도 ( O(n log n) )

 

'코딩테스트 파이썬 > 백준' 카테고리의 다른 글

암호 만들기 ( 1759 번 )  (0) 2026.01.04
나무 자르기 ( 2805 번 )  (0) 2026.01.01
좋다 ( 1253 번 )  (0) 2026.01.01
수들의 합 5 ( 2018 번 )  (4) 2025.12.30
열쇠 ( 9328 번 )  (0) 2025.12.05