[Softeer]

Question

Language: Python

해당 문제는 주어진 예산을 기반으로 클러스터를 구성하는 컴퓨터의 성능을 업그레이드 해서 최소 성능을 가지는 컴퓨터의 성능을 최대화하는 것이 목표이다. 하지만, 예산의 크기가 1018으로 매우 크기 때문에 O(n)의 풀이로는 해결할 수 없다.

이런 유형의 문제의 경우 대부분 binary search을 활용하여 문제를 풀이할 수 있다.

결국, 예산 = 업그레이드 할 수 있는 성능으로 볼 수 있기 때문에 최대 업그레이드 가능 값은 예산으로 설정해서 이진탐색을 통해 최대로 갖출수 있는 최소 성능 값을 구한다.

Solution

import sys
def solution():
    start,end=0,10**18
    maximum_minimal_performance=0
    while start <= end:
        mid=(start+end)//2
        cost=0
        #최소 성능을 mid으로 맞추기 위해 필요한 비용을 계사한다.
        for number in numbers:
            cost+=max(mid-number,0)**2
        #예산 내에 업그레이드가 가능한 경우 성능값을 높인다.
        if cost <= b:
            maximum_minimal_performance=max(maximum_minimal_performance,mid)
            start=mid+1
        #예산을 넘어서는 경우 성능값을 낮춘다.
        else:
            end=mid-1
    
    print(maximum_minimal_performance)

if __name__ == "__main__":
    n,b=map(int,sys.stdin.readline().split())
    numbers=list(map(int,sys.stdin.readline().split()))
    solution()

댓글남기기