알고리즘: 그리디
이 문제는 다음 도시에서의 주유 가격이 현재 도시의 가격보다 저렴한지 비싼지 비교하여, 현재 도시의 주유 가격이 더 싸다면 현재 주유소에서 오른쪽에 있는 도시들의 거리까지 갈 수 있도록 주유를 해야한다. 단 오른쪽에 있는 도시들 중 현 주유소보다 더 싼 곳이 있다면 그 지점부터는 더 싼 가격으로 주유를 해야한다.
부분 성공(58점)
const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : '../input.txt';
const [n, d, p] = fs.readFileSync(filePath).toString().trim().split('\n');
let dis = d.split(' ').map(Number); // 1
let cost = p.split(' ').map(Number); // 1
let curr = cost[0]; // 2
let sum = 0; // 3
for (let i = 0; i < n - 1; i++) {
sum += curr * dis[i]; // 4
if (curr > cost[i + 1]) curr = cost[i + 1]; // 5
}
console.log(sum);
알고리즘: 그리디
- 도시 간의 거리를 dis 변수에 Number 타입 배열로, 주유소의 리터당 가격을 cost 배열에 Number 타입 배열로 할당했다.
- curr 은 지나온 마을들 중 가장 싼 주유값을 담을 것이다. 초깃값으로 가장 앞 도시를 할당한다.
- 가장 마지막 마을은 주유가 필요 없기 때문에 n - 1 까지 반복한다.
- 지나온 거리까지 주유한 가격이다. (가격 x 거리)
- 다음 도시의 주유 가격이 더 싸다면
curr
변수에 다음 주유 가격을 저장한다.
위 과정을 반복하면 최종적으로 최소의 비용을 계산할 수 있다.
58점 으로 부분 성공했다. 서브 태스크의 2번까지 수행한 것이다.
3번 태스크의 ‘원래의 제약조건 이외에 아무 제약조건이 없다.’ 가 무슨 의미인지 한참 고민했다.
다른 사람들의 코드를 보니 Number 타입이 아닌 BigInt 타입을 사용했다.
BigInt 는 길이의 ‘제약 없이’ 정수를 다룰 수 있게 해주는 숫자형이다.
성공 (100점)
코드를 모두 Number
타입이 아닌 BigInt
타입으로 변경하여 재 제출했다.
const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : '../input.txt';
const [n, d, p] = fs.readFileSync(filePath).toString().trim().split('\n');
let dis = d.split(' ').map(BigInt);
let cost = p.split(' ').map(BigInt);
let curr = cost[0];
let sum = 0n;
for (let i = 0; i < n - 1; i++) {
sum += curr * dis[i];
if (curr > cost[i + 1]) curr = cost[i + 1];
}
console.log(String(sum));
성공!