CS/Data Structure & Algorithm

결정 알고리즘 (랜선 자르기)

Coding Kitsune 2022. 6. 1. 21:16

결정 알고리즘을 이용할 때는 이분탐색을 이용하고, 문제에서 보통 답의 범위를 알 수 있다.

 

 

알고리즘은 다음과 같다.

 

주어진 수들 중에서 max를 찾는다. 그럼 범위는 1 ~ MAX의 수가 될 것이고,

 

이분탐색으로 중간값을 찾아 답이 되는지 찾아본다.

 

답이 되는지 찾아보기 위해, Count 함수를 만든다. 이 함수는 주어진 숫자들을 파라미터로

 

받은 값들로 모두 나누었을 때 그 합을 반환한다.

 

반환한 값과 K 값을 비교하여, 반환 값이 더 작으면 답이 될 수 없으므로 중간값 기준 더 작은

 

값, 즉 왼쪽을 탐색해야한다. 반환값이 K값보다 크거나 같을 때는 오른쪽을 탐색한다.

 

그렇게 while문을 반복하며 lt <= rt가 될때까지 반복하다 보면 최적의 닶이 나오게 된다.

 

이분탐색 기반의 가장 기본적인 알고리즘이며, 기본인 만큼 많이 쓰이고 중요한 알고리즘이니,

 

확실하게 익혀둘 필요가 있다고 생각한다. 전체 코드는 다음과 같다.

 

 


import sys
#sys.stdin=open("input.txt", 'rt')
MAX = 0
K, N = map(int, input().split())
lst = []

def Count(num): #총 몇개의 랜선 조각이 나오는지 반환
    cnt = 0
    for i in lst:
        cnt += (i // num)
    return cnt

for i in range(K):
    lst.append(int(input()))
    if lst[i] > MAX:
        MAX = lst[i]

lt = 1
rt = MAX

while lt <= rt:
    mid = (lt+rt) // 2
    if Count(mid) < N:
        rt = mid-1
    else:
        res = mid
        lt = mid+1

print(res)