코딩 테스트

[그리디 알고리즘] 백준 13305번. 주유소 (파이썬)

soonge2 2024. 3. 31. 03:00

백준 13305번 🔗https://www.acmicpc.net/problem/13305

 

13305번: 주유소

표준 입력으로 다음 정보가 주어진다. 첫 번째 줄에는 도시의 개수를 나타내는 정수 N(2 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 인접한 두 도시를 연결하는 도로의 길이가 제일 왼쪽 도로부터 N-1

www.acmicpc.net

주유소가 중간중간 있는 일직선을 자동차로 이동할 때 최소 주유 요금을 구하는 문제이다. 

 

import sys
input = sys.stdin.readline

N = int(input())

distance = list(map(int, input().split()))
charge = list(map(int, input().split()))

sum = 0
for i in range(N-1):
    sum += charge[i] * distance[i] # 다음 주유소까지 가야하는 만큼 충전
    if charge[i] < charge[i+1]: # 현재 주유소 가격이 다음 주유소 가격보다 더 싸면
        charge[i+1] = charge[i] 
        # 다음 주유소 요금을 현재 요금으로 변경 
        # ∵ 현재 주유소에서 다음 것까지 충전 = 다음 주유소에서 현재 요금으로 충전
        
print(sum)

 

풀이 아이디어를 떠올리는 게 어려운 문제였지만, 방법을 알고 나면 구현은 쉬운 문제이다.

 

🚗 풀이 방법

요금이 비싼 주유소에서는 최소로 충전해야 하고, 요금이 싼 주유소에서는 최대로 충전해야 한다. 

 

만약 현재 주유소 요금이 다음 주유소 요금보다 싸면 다음 주유소에서 충전해야 하는 양도 함께 충전해야 주유 요금을 최소로 만들 수 있다. 

현재 주유소에서 다음 것까지 충전하는 것은 다음 주유소에서 현재 요금으로 충전하는 것과 같다. 

따라서 현재 주유소에서 다음 주유소 요금과 비교한 뒤, 만약 현재 주유소 요금이 더 저렴하면 다음 주유소 요금을 바꿔놓으면 된다.

 

그래서 코드 작성할 때는

1. 각 주유소에서는 다음 주유소까지 필요한 만큼만 충전하고,

2. 최소 요금을 위해 현재 요금 < 다음 요금인 경우 다음 주유소의 요금을 바꿔주면 된다.