[백준 13305] 주유소

Date:     Updated:

카테고리:

태그:

난이도

실버 III

📜문제

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

image image

❌틀린 풀이

#include <iostream>
#include <vector>

using namespace std;

vector<long long> Oil;
vector<long long> Road;

int main()
{
	int N = 0;
	cin >> N;

	long long total = 0;
	long long value = 0;

	for (long long i = 0; i < N-1; i++)
	{
		cin >> value;
		Road.push_back(value);
	}
	Road.push_back(0);

	for (long long i = 0; i < N; i++)
	{
		cin >> value;
		Oil.push_back(value);
	}

	for (long long i = 0; i < N-1; i++)
	{
		if (Oil[i] < Oil[i + 1])
		{
			total += Oil[i] * (Road[i] + Road[i + 1]);
			i++;
		}
		else
		{
			total += Oil[i] * Road[i];
		}
	}

	cout << total << "\n";

	return 0;
}

틀린 풀이 같은 경우 전체 값을 계산할때 최소 기름값을 구하고 거기에 전체 길이를 더해서 계산하려고 했다.
그러다 보니 계산이 복잡해지고 3칸 이상 길이를 더할 때 문제가 생겼다.

⭕맞은 풀이

#include <iostream>
#include <vector>

#define ll long long

using namespace std;

vector<ll> Oil;
vector<ll> Dist;

int main()
{
	int N = 0;
	cin >> N;

	ll value = 0;
	for (ll i = 0; i < N-1; i++)
	{
		cin >> value;
		Dist.push_back(value); // 거리 입력
	}
	Dist.push_back(0);


	for (ll i = 0; i < N; i++)
	{
		cin >> value;
		Oil.push_back(value); // 기름값 입력
	}

	ll min_oil = Oil[0]; // 가장 싼 기름값 설정
	ll answer = 0;

	for (int i = 0; i < N; i++)
	{
		if (min_oil > Oil[i])
		{
			min_oil = Oil[i]; // 최저 기름값 변경
		}
		answer += Dist[i] * min_oil;
	}

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

Dist.push_back(0)을 해준 이유는 어차피 Oil의 맨 마지막 값은 고려안해도 되는데 입력은 해야하므로 0을 넣어줘서 아래 for문에서 읽을수는 있게 하지만 읽어도 어차피 값이 0이므로 answer에는 영향을 미치지 않는다.

틀린 풀이와 다르게 최소 기름값을 구했으면 바로 거리와 곱해서 값을 계산했다.
그렇게 되면 계산을 복잡하지 않게 값을 구할 수 있다.

❗주의

입력값이 int로는 계산이 되지 않는다 그래서 long long으로 설정해서 문제를 풀어야한다.

맨 위로 이동하기

BOJ 카테고리 내 다른 글 보러가기

댓글남기기