문제설명
가지고 있는 랜선의 개수, 필요한 개수, 가지고 있는 랜선들의 길이를 받은뒤 랜선을 모두 같은 길이로 자를 때 자를 수있는 최대 길이를 구하는 문제입니다.
작동 순서
1. 가지고 있는 랜선의 개수, 필요한 개수를 입력받습니다.
2. 가지고 있는 랜선들의 길이를 입력받습니다.
3. 자르는 길이는 1부터 가장 긴 랜선의 길이로 지정합니다.
4. 이진탐색을 이용하여 랜선을 잘랐을 때 개수가 부족한 경우 start 값을 늘리고 개수가 넘치는 경우 final 값을 줄여가면서 최대값을 찾습니다.
5. 찾은 최대값을 출력합니다.
소스코드
import sys
N, M = map(int, sys.stdin.readline().split())
cable = []
for i in range(N):
cable.append(int(sys.stdin.readline()))
start = 1
final = max(cable)
max_length = 0
while start <= final:
count = 0
length = (start+final)//2
for i in range(len(cable)):
count += cable[i]//length
if count >= M and max_length < length:
max_length = length
if count >= M:
start = length+1
else:
final = length-1
print(max_length, end='')
후기
매개변수 탐색을 처음 접해봐서 생소했던 문제였지만 이진탐색과 크게 다르지 않아서 풀 수 있었던 것 같습니다. 다양한 유형의 문제들을 접해봐야 할 것 같습니다.