본문 바로가기
알고리즘

백준_1654_랜선 자르기(이분 탐색)

by 매화of사군자 2020. 2. 19.

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

 

1654번: 랜선 자르기

첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그 후 K줄에 걸쳐 이미 가지고 있는 각 랜선의 길이가 센티미터 단위의 정수로 입력된다. 랜선의 길이는 231-1보다 작거나 같은 자연수이다.

www.acmicpc.net

해결 방법

> left는 1(문제에서 최소 길이가 1이라고 함), right는 주어진 랜선 중 최대값

> 이분 탐색을 돌린다.

> right를 출력한다.

 

Right를 출력하는 이유

1. 이분 탐색을 돌릴 때 조건을 left <= right로 주었다.(right가 left보다 작아진 첫 시점이 출력시점)

2. 문제 조건 중 N개보다 많이 만드는 것도 N개를 만드는 것에 포함된다.

    2- 1. 이분 탐색을 돌리는 중에 N개보다 많이 만들어질 수도 있다. 하지만 2 - 2조건에 의해 정답이 아닐수 있다.

    2- 2. 문제 조건 중 이때 만들 수 있는 최대 랜선의 길이를 구하는 프로그램을 작성하시오.

 

코드

더보기

k, n = map(intinput().split())

 

cable = list()

for i in range(k):

    cable.append(int(input()))

 

left = 1

right = max(cable)

 

while left <= right:

    mid = (left + right) // 2

    tmp = 0

    for i in cable:

        tmp += i // mid

    if tmp < n:

        right = mid - 1

    else:

        left = mid + 1

 

print(right)

 

'알고리즘' 카테고리의 다른 글

백준_2110_공유기 설치  (0) 2020.02.21
백준_10816_숫자카드2(Counter)  (0) 2020.02.20
백준_2512_예산(이분 탐색)  (0) 2020.02.18
백준_15997_승부 예측  (0) 2020.02.17
백준_10815_숫자 카드(이분 탐색)  (0) 2020.02.16

댓글