BOJ 13305 (주유소)

JH·2023년 6월 17일
0

BOJ 알고리즘 (C++)

목록 보기
67/97
  • 문제
    어떤 나라에 N개의 도시가 있다. 이 도시들은 일직선 도로 위에 있다. 편의상 일직선을 수평 방향으로 두자. 제일 왼쪽의 도시에서 제일 오른쪽의 도시로 자동차를 이용하여 이동하려고 한다. 인접한 두 도시 사이의 도로들은 서로 길이가 다를 수 있다. 도로 길이의 단위는 km를 사용한다.

    처음 출발할 때 자동차에는 기름이 없어서 주유소에서 기름을 넣고 출발하여야 한다. 기름통의 크기는 무제한이어서 얼마든지 많은 기름을 넣을 수 있다. 도로를 이용하여 이동할 때 1km마다 1리터의 기름을 사용한다. 각 도시에는 단 하나의 주유소가 있으며, 도시 마다 주유소의 리터당 가격은 다를 수 있다. 가격의 단위는 원을 사용한다.

    예를 들어, 이 나라에 다음 그림처럼 4개의 도시가 있다고 하자. 원 안에 있는 숫자는 그 도시에 있는 주유소의 리터당 가격이다. 도로 위에 있는 숫자는 도로의 길이를 표시한 것이다.

    제일 왼쪽 도시에서 6리터의 기름을 넣고, 더 이상의 주유 없이 제일 오른쪽 도시까지 이동하면 총 비용은 30원이다. 만약 제일 왼쪽 도시에서 2리터의 기름을 넣고(2×5 = 10원) 다음 번 도시까지 이동한 후 3리터의 기름을 넣고(3×2 = 6원) 다음 도시에서 1리터의 기름을 넣어(1×4 = 4원) 제일 오른쪽 도시로 이동하면, 총 비용은 20원이다. 또 다른 방법으로 제일 왼쪽 도시에서 2리터의 기름을 넣고(2×5 = 10원) 다음 번 도시까지 이동한 후 4리터의 기름을 넣고(4×2 = 8원) 제일 오른쪽 도시까지 이동하면, 총 비용은 18원이다.

    각 도시에 있는 주유소의 기름 가격과, 각 도시를 연결하는 도로의 길이를 입력으로 받아 제일 왼쪽 도시에서 제일 오른쪽 도시로 이동하는 최소의 비용을 계산하는 프로그램을 작성하시오.

  • 입력
    표준 입력으로 다음 정보가 주어진다. 첫 번째 줄에는 도시의 개수를 나타내는 정수 N(2 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 인접한 두 도시를 연결하는 도로의 길이가 제일 왼쪽 도로부터 N-1개의 자연수로 주어진다. 다음 줄에는 주유소의 리터당 가격이 제일 왼쪽 도시부터 순서대로 N개의 자연수로 주어진다. 제일 왼쪽 도시부터 제일 오른쪽 도시까지의 거리는 1이상 1,000,000,000 이하의 자연수이다. 리터당 가격은 1 이상 1,000,000,000 이하의 자연수이다.

  • 출력
    표준 출력으로 제일 왼쪽 도시에서 제일 오른쪽 도시로 가는 최소 비용을 출력한다.

#include<iostream>
#include<algorithm>
using namespace std;
int N;
long long road[100001];
long long price[100000];
long long answer, current_price;
void fast_io()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
}

int main()
{
	fast_io();

	cin >> N;
	for (int i = 1; i < N; i++)
	{
		cin >> road[i];
	}
	for (int i = 1; i <= N; i++)
	{
		cin >> price[i];
	}
	current_price = price[1];
	answer = road[1] * price[1];
	for (int i = 2; i <= N; i++)
	{
		if (current_price > price[i])
		{
			current_price = price[i];
		}
		answer += road[i] * current_price;
	}
	cout << answer;
	return 0;
}

  처음에는 최소 값을 구하라는 문제라 DP 방식을 사용하였는데 서브태스크 1 하나만 점수가 인정 되었다. DP문제는 항상 최대, 최소값이 보장되어서 Greedy 알고리즘을 쓰지 않고 DP를 사용하였는데 문제 분류를 보니 Greedy 알고리즘 문제로 해결해야 했다.
(DP는 예제의 경우는 도시가 많지 않아 적용이 잘 되는 듯 싶으나 도시가 많을땐 아마 경우의 수가 매우 많아서 그렇지 않을까 싶다)

DP와 유사하게 첫번째에서 2번째 도시로 가는 경우는 선택지가 없으므로 초기 값을 넣어주고 이후 현재 도시의 기름값과 다음 도시의 기름값을 비교하여 작은 쪽에서 도로의 길이만큼 주유를 해주면 된다.

또 문제에 주어진 거리 최대값이 10억이기 때문에 int형을 쓴다면 오버 플로우가 난다 이 점도 주의 해야한다.

숏코딩 X
대부분 풀이 비슷

시간복잡도 : O(N)

profile
블로그 -> 노션

0개의 댓글