[C++]백준13305번 주유소

1 minute read

오늘은 백준13305번 주유소 문제를 풀어보도록 하자. 난이도에 비해 정답률이 꽤 낮았다. 우선 위 문제는 자료형이 중요하다. 문제를 보면 알겠지만 거리와 리터 당 가격은 10억 가까이 된다.

입력받는 배열은 int타입도 상관없지만(21억 under) 저장변수들은 21억을 훌쩍 넘길 수 있기에 int형이 아닌 long long 타입을 선언해야한다.

위를 유념하고 접근해보자.

문제는 다음과 같다.

                               [접근법]

  1. 맨 왼쪽 도시에서 오른쪽 도시로 가는데 최소의 비용으로 가야한다. 따라서 city배열을 처음부터 탐색하면서 기름 값이 작은 곳을 찾는다.
  
  2. 만일 찾지 못할 경우 distance에 거리를 계속 누적합을 해준다. 찾을 경우엔 원래 기름 값 * distance을 result에 누적합 후 distance = 0, price는 찾은 기름으로 갱신해준다.

  3. 마지막이 중요한데, 아직 계산이 끝난 것이 아니다. 도달하기 전 까지의 계산만 해준 것이므로 출력 값에  price * (distance + meter[n - 1])를 더해주어야 한다.
                                     [코드]
#include <iostream>
#include <algorithm>
using namespace std;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);

	int meter[100001];
	int city[100001];
	int n;
	long long result = 0, price = 0, distance = 0;

	cin >> n;

	for (int i = 1; i < n; i++) {
		cin >> meter[i];
	}
	for (int i = 0; i < n; i++) {
		cin >> city[i];
	}

	price = city[0];

	for (int i = 1; i < n - 1; i++) {
		if (price > city[i]) {
			result += price * (distance + meter[i]);
			price = city[i];
			distance = 0;
		}
		else {
			distance += meter[i];
		}
	}
	cout << result + price * (distance + meter[n - 1]) << '\n';
}