백준/Search

[이분탐색/백준] 1654번: 랜선 자르기

ydin 2022. 12. 28. 18:39

- 문제 : https://www.acmicpc.net/problem/1654

 

Silver Lv2 문제이고, 스스로 푼 문제다!

알고리즘 수업 때 들은 내용이 어렴풋이 기억나서 적용했다. 

 

풀이 과정 

 

  • 각 랜선의 길이의 길이를 합한 다음 목표 갯수로 나누어서 원하는 결과를 만들기 위한 최대 길이를 구한다.
  • 그 길이를 가장 끝점 이라고 정한뒤 이분탐색을 진행한다.
    • 각 단계에서 랜선을 얼마나 자를지 길이를 mid로 정한다. 
    • 각 랜선을 mid로 자른뒤 나오는 총 갯수를 result에 저장한다. 
    • result가 k 이상이라면, result로 만들 수 있는 총 갯수를 answer에 누적해간다.(문제에서 k개 이상 만들 수 있는 경우는 모두 정답으로 친다고 했다)
    • result가 k 초과라면 mid의 크기가 너무 커서 만들어지는 랜선의 갯수가 적은 것이므로 right를 줄여준다. 
    • answer에는 k개를 만들 수 있는 랜선의 길이들이 있으므로, 그 중에서 최댓값을 출력한다. 

 

- 정답 풀이 : 

import sys
input = sys.stdin.readline

n, k = map(int, input().split())
wires = [int(input()) for _ in range(n)]

answer = [] 
left, right = 0, sum(wires) // k 
while left <= right : 
    mid = (left + right + 1) // 2
    result = 0
    for wire in wires:
        result += wire // mid
    
    if result >= k:
        answer.append(mid)
        left = mid + 1
    else:
        right = mid - 1

print(max(answer))

 

신기하게 Pypy3로 돌릴 때보다 Python으로 돌렸을 때 시간이 더 짧다