본문 바로가기
C++ 코딩 문제 풀이/백준

[Baekjoon] 13305번: 주유소

by 섬댕이 2023. 7. 28.

https://www.acmicpc.net/problem/13305

 

13305번: 주유소

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

www.acmicpc.net

 

 


 

문제 해결 과정

착안

아래와 같이 탐욕(greedy) 알고리즘에 기반하여 문제를 해결할 수 있다.

 

  • 현재 위치해 있는 도시의 주유 비용을 기준으로 삼는다.
  • 순차적으로 우측 도시를 탐색하며 현재 도시의 주유 비용보다 주유 비용이 더 저렴한 도시를 탐색한다.
  • 탐색에 성공하면, 현재 도시에서 주유하여 해당 도시까지 한 번에 이동한다.
  • 탐색에 실패하면, 현재 도시에서 마지막 도시까지 한 번에 이동한다.
  • 위의 과정을 가장 우측 도시에 도착할 때까지 반복한다.

 

구현

[스포 주의] 아래 '더보기'를 누르면 코드가 나오니 주의하세요~

더보기
#include <iostream>

using namespace std;

int N;
int Cities[100000];
int Edges[99999];
size_t Cost;

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

	cin >> N;
	for (int i = 0; i < N - 1; i++)
		cin >> Edges[i];

	for (int i = 0; i < N; i++)
		cin >> Cities[i];

	int i = 0;
	while (i < N - 1)
	{
		int oilCost = Cities[i];
		int distSum = 0;

		while (oilCost <= Cities[i])
		{
			if (i == N - 1)
				break;

			distSum += Edges[i++];
		}

		Cost += (size_t)distSum * (size_t)oilCost;
	}

	cout << Cost << "\n";
	return 0;
}

 

실행 결과

'C++ 코딩 문제 풀이 > 백준' 카테고리의 다른 글

[Baekjoon] 12865번: 평범한 배낭  (0) 2023.08.01
[Baekjoon] 1629번: 곱셈  (0) 2023.07.31
[Baekjoon] 16234번: 인구 이동  (0) 2023.07.26
[Baekjoon] 11404번: 플로이드  (0) 2023.07.25
[Baekjoon] 2293번: 동전 1  (0) 2023.07.24

댓글