Algorithm/📖Baekjoon

#13305 주유소

yewoneeee 2022. 4. 22. 21:21

# 문제

# 입력 및 출력

# 풀이

처음에 문제를 보고 좀 당황했다ㅋㅋ

어떻게 그리디로 풀지 모르겠더라

근데 어떻게 쓰다보니까 이게 되네 싶어서 간단하게 풀었다

리터당 가격을 하나씩 비교하면서 최소값을 찾아서 distance값을 곱해주면 된다

 

처음 코드가 아래와 같았는데 문제가 좀 있었다

#include <iostream>
using namespace std;
int dis[100000];
int price[100000];

int main() {
	int n;
	cin >> n;
	n--;
	for (int i = 0; i < n; i++) {
		cin >> dis[i];
	}
	for (int i = 0; i < n; i++) { // 문제 1) 하나 덜 입력됨
		cin >> price[i];
	}

	int minv = 1000000000, result = 0;
	for (int i = 0; i < n; i++) {
		minv = min(minv, price[i]);
		result += minv * dis[i]; // 문제 2) 곱셈 값이 int 범위 초과
	}
	cout << result;
}

위의 두 문제 때문에 서브태스크 3번에서 틀렸다고 나오더라

서브태스크 1, 2번은 맞다고 나오는거 보면 문제 1은 저렇게 써도 잘 작동됐던건지는 모르겠다ㅋㅋㅋ

리터당 가격이랑 distance값이 1,000,000,000이하길래 int 범위 내라고 생각했는데

곱셈으로 가면 int 범위를 훨씬 넘겠구나 생각해서 long long으로 바꿔줬다

min() 함수 매개변수 타입 일치 문제 때문에 dis, price 배열도 다 long long 으로 선언해줬음

 

#include <iostream>
using namespace std;

#define INF 987654321;
long long dis[100000];
long long price[100000];

int main() {
	int n;
	cin >> n;
	for (int i = 0; i < n - 1; i++) {
		cin >> dis[i];
	}
	for (int i = 0; i < n; i++) {
		cin >> price[i];
	}

	long long minv = INF; // 혹시 몰라서 값을 크게 설정해줌
	long long result = 0;
	for (int i = 0; i < n - 1; i++) {
		minv = min(minv, price[i]);
		result += minv * dis[i];
	}
	cout << result;
}