[Programmers] Q86503 금과 은 운반하기

Question

Language: Python

주어진 문제의 입력 조건을 확인하면 2 * 109 * 105 만큼의 시간이 소요되므로 O(logn)의 접근이 요구된다. 따라서, 시간에 대한 이분 탐색을 통해 문제를 풀이한다.

모든 도시에서 병렬적으로 금,은을 운반하는 것이 가능하므로 각각의 도시에 대해 운반 가능한 최대 금, 은, 총 운반량을 구해서, 주어진 조건에 만족하는지를 확인한다.

#아래의 조건이 성립하는 경우에 대해서 도시를 짓기 위한 광물 양을 맞출 수 있다.
if gold_sum >=a and silver_sum >=b and total_sum >=a+b:
    end=mid-1
    answer=mid

Solution

def solution(a, b, g, s, w, t):
    answer=-1
    start,end=0,10**16
    #최소 시간에 대한 경우를 구하는 경우 이므로 --> 시간이 많이 걸리는 경우 이분 탐색을 활용한다.
    while start <= end:
        mid=(start+end)//2
        
        gold_sum,silver_sum,total_sum=0,0,0
        
        for gold,silver,weight,time in zip(g,s,w,t):
            #최대 왕복 횟수
            moving_count=(mid // (2*time))
            #편도 추가
            if mid % (2*time) >= time:
                moving_count+=1
                
            #최대 이동 가능 중량
            available_total=moving_count * weight
            
            #금,은,최대 이동 중량 에 대한 조사
            gold_sum += min(available_total,gold)
            silver_sum += min(available_total,silver)
            total_sum += min(available_total,gold+silver)

        #a 이상 금, b이상의 금, 총 중량이 a+b를 초과하므로 해당 시간 내에 이동하는 것이 가능하다.
        if gold_sum >=a and silver_sum >=b and total_sum >=a+b:
            end=mid-1
            answer=mid
        else:
            start=mid+1
            
       
    return answer

댓글남기기