코딩테스트/백준

[Python] 백준 1654. 랜선 자르기

jungmin.park 2023. 11. 1. 15:42

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

 

1654번: 랜선 자르기

첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그

www.acmicpc.net

문제 설명:

만약 4개의 랜선이 주어지고 11개의 랜선을 만들려고 할 때 최대 길이 갯수를 구하는 문제이다.

4개의 랜선은 예를 들면 [802, 743, 457, 539] 랜선의 길이가 주어진다.

 

최대 길이가 200일때

802cm 랜선에서 4개, 743cm 랜선에서 3개, 457cm 랜선에서 2개, 539cm 랜선에서 2개를 잘라내 모두 11개를 만들 수 있다.

 

이진탐색 

  • lan에 입력받은 리스트 [802, 743, 457, 539] 가 있다고 가정한다.
  • mid (이진탐색)을 하기 위해 start, end를 다음과 같이 둔다.
start, end = 1, max(lan)

 

  • mid와 랜선의 갯수를 세기위해 lines 선언한다.
  • 리스트를 반복하여 요소 // mid 를 하면 랜선 하나당 몇 개의 랜선이 나오는지 알 수 있다.
    mid = (start + end) // 2 
    lines = 0 #랜선 수
    for i in lan:
        lines += i // mid

 

  • 랜선의 갯수가 얻으려는 랜선보다 많으면 중간값이 너무 작아서 많은 랜선을 얻게 되는 것 -> start(작은값)를 mid+1 옮겨준다.
  • 랜선의 갯수가 얻으려는 랜선보다 적으면 중간값이 너무 커서 적은 랜선을 얻는 것이기 때문에 -> end(큰값)을 옮겨준다.
    if lines >= N: 
        start = mid + 1
    else:
        end = mid - 1