백준 13305 주유소
by 진혀크
문제
입력
표준 입력으로 다음 정보가 주어진다. 첫 번째 줄에는 도시의 개수를 나타내는 정수 N(2 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 인접한 두 도시를 연결하는 도로의 길이가 제일 왼쪽 도로부터 N-1개의 자연수로 주어진다. 다음 줄에는 주유소의 리터당 가격이 제일 왼쪽 도시부터 순서대로 N개의 자연수로 주어진다. 제일 왼쪽 도시부터 제일 오른쪽 도시까지의 거리는 1이상 1,000,000,000 이하의 자연수이다. 리터당 가격은 1 이상 1,000,000,000 이하의 자연수이다.
출력
표준 출력으로 제일 왼쪽 도시에서 제일 오른쪽 도시로 가는 최소 비용을 출력한다.
예제
4
2 3 1
5 2 4 1
나의 접근 방법
연료값이 가장 싼 곳을 계속해서 이용한다고 생각하면 쉽다. 연료를 무제한으로 채울 수 있다고 가정했으니 min값을 기억해뒀다가 새로운 도시의 연료값이 min값보다 싸면 바꿔주고 그렇지 않으면 min값의 연료를 사용하면 된다.
내가 실수했던 것
각 도시간의 거리가 1이상 1000000000 이하, 리터당 가격이 1이상 1000000000 이하인 줄 알고 1000000000 * 1000000000 * 100000이 정답의 범위인 줄 알고 unsigned long long으로도 값을 저장할 수 없다고 판단하고 string을 활용한 덧셈을 구현했다. 그런데 다시 읽어보니 가장 왼쪽부터 오른쪽까지 가는 거리가 1000000000이었다. 즉 long long으로도 커버가 되는 거리인데 왜 내 코드에서는 WA가 났던 것일까 생각해봤더니 각 도시간의 거리와 연료의 가격을 int로 저장하고 있었던 것이 문제였다. unsigned long long * int 의 연산이 발생해서 int로 변환이 되었던 것이다. 앞으론 주의해야겠다.
코드
이왕 string으로 큰 수 더하는 함수를 짜둔 김에 코드를 2개다 공유한다.
// 코드1
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
int main(void){
cin.tie(NULL);
ios_base::sync_with_stdio(false);
int N, min=1000000000;
cin>>N;
vector<unsigned long long> dist(N-1), price(N);
long long result = 0;
for(int i = 0 ; i<N-1 ; i++) cin>>dist[i];
for(int i = 0 ; i<N ; i++) cin>>price[i];
for(int i = 0 ; i<N-1 ; i++){
min = min > price[i] ? price[i] : min;
result += min * dist[i];
}
cout<<result;
return 0;
}
// 코드2
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
string addNumByString(string A, string B){
int sum = 0;
string result = "";
while(!A.empty() || !B.empty() || sum){
if(!A.empty()){
sum += A.back() - '0';
A.pop_back();
}
if(!B.empty()){
sum += B.back() - '0';
B.pop_back();
}
result += (sum % 10) + '0';
sum /= 10;
}
reverse(result.begin(), result.end());
return result;
}
int main(void){
cin.tie(NULL);
ios_base::sync_with_stdio(false);
int N, min=1000000000;
cin>>N;
vector<unsigned long long> dist(N-1), price(N);
vector<string> sums(N-1);
long long result = 0;
for(int i = 0 ; i<N-1 ; i++) cin>>dist[i];
for(int i = 0 ; i<N ; i++) cin>>price[i];
for(int i = 0 ; i<N-1 ; i++){
min = min > price[i] ? price[i] : min;
unsigned long long sum = min*dist[i];
sums[i] = to_string(sum);
}
string now = sums[0];
for(int i = 1 ; i<N-1 ; i++) now = addNumByString(now, sums[i]);
cout<<now;
return 0;
}
Subscribe via RSS