[백준 13305] 주유소
카테고리: BOJ
난이도
실버 III
📜문제
❌틀린 풀이
#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
으로 설정해서 문제를 풀어야한다.
댓글남기기