[백준] 주유소 풀이

Hyunwoo Park·2021년 3월 8일
0

알고리즘

목록 보기
5/19

제가 푼 방식으로 핵심 아이디어를 설명하겠습니다.

주유소를 지나가며 리터 당 가격이 가장 저렴한 주유소 가격을 저장하고, (0번 인덱스의 주유소 리터당 가격으로 초기화 합니다.)
현재 주유소 리터 당 가격과 비교하며,

현재 주유소 리터 당 가격이 비싸면 -> 리터 당 가격이 가장 저렴한 주유소 가격 X 다음 주유소까지의 거리를 total에 더합니다.

현재 주유소 리터 당 가격이 더 싸면 -> 리터 당 가격이 가장 저렴한 주유소 가격이 담긴 변수를 업데이트 후, 업데이트 된 변수 * 다음 주유소까지의 거리를 total에 더합니다.

즉, 이번에 이용하는 주유소가 싼지 비싼지 모르겠네? -> 일단 가격을 저장해 놓고 다음 주유소까지 갈 양만 충전하자.

-> 저번 주유소가 더 싸네? -> 전에 저장해뒀던 값을 이용하자(이미 지나쳤지만 가격은 알고 있기에 이용 가능)
-> 저번 주유소가 더 비싸네? -> 싼 주유소 가격을 이번 주유소 가격으로 업데이트 한 뒤 다음 주유소 거리까지 충전해서 가자.

라고 생각하시면 됩니다.

초반에 몇 회의 실패를 거듭하였습니다. 이유로는 실시간으로 리터 당 가격이 저렴한 주유소 가격을 업데이트 하는 것이 아닌,
min 함수로 리터 당 가격이 저렴한 주유소의 가격을 미리 구하고 시작하였기 때문입니다.
즉, 상대적으로 싼 주유소라도 최솟값이 아니면 단지 다음 주유소까지의 주유만 하게 되어 오차가 발생하게 되었습니다.

N = int(input())
length = list(map(int, input().split()))
cost = list(map(int, input().split()))

min_cost = cost[0]  # 일단 첫 번째 요소가 가장 작다고 생각합니다.
total_cost = 0  # 정답이 담길 변수를 0으로 초기화 합니다.
total_cost += cost[0] * length[0]  # 첫 단계에선, 일단 다음 단계까지 가는 양 만큼만 충전합니다.

for i in range(1, len(cost) - 1):

    if min_cost < cost[i]:  # min_cost보다 현재 주유소가 비싸면, min_cost에서 가야 할 거리를 곱하여 더합니다.(즉, 싼 주유소에서 더 충전했다고 생각하시면 됩니다.)
        total_cost += min_cost * length[i]

    else:  # 그게 아니라면, 최소 충전 가격을 현재 주유소의 가격으로 업데이트 시킨 다음, 가야 할 거리만큼 곱하여 더해 줍니다.
        min_cost = cost[i]
        total_cost += min_cost * length[i]
profile
만나서 반갑습니다.

0개의 댓글