오늘 푼 문제는 각 도시마다 기름값이 다른데 N개의 도시를 모두 돌 수 있는 최소 기름값을 구하는 문제였다.
생각보다 문제가 길고 조건이 많아서 이해하는데 시간이 오래 걸렸다.
핵심은 최소값을 이용하는 것인데 이 부분을 캐치하지 못해서 시간을 많이 낭비했다.


이건 내가 처음 푼 코드다.
이렇게 풀고 나서 채점을 해봤더니 58점이 나왔다.
아무리 봐도 원인을 모르겠어서 한참 고민하다가 값의 범위로 인한 오류는 아닐까 싶었다.
(지금은 이렇게 한 줄로 쓰지만 정말 원인을 찾는데 오래걸렸다.)
let input = require("fs")
.readFileSync("/dev/stdin")
.toString()
.trim()
.split("\\n");
let city = parseInt(input[0]); // 도시의 수
let kmArr = input[1].split(" ").map(Number); // 거리 배열
let oilPriceArr = input[2].split(" ").map(Number); // 가격 배열
let totalPrice = 0;
let minPrice = oilPriceArr[0]; // 처음 도시의 기름값을 최소로 설정
for (let i = 0; i < city - 1; i++) {
if (oilPriceArr[i] < minPrice) {
minPrice = oilPriceArr[i];
}
totalPrice += minPrice * kmArr[i];
}
console.log(totalPrice);
그래서 long long 정도의 범위를 커버할 수 있는 방법을 찾다가
BigInt 라이브러리를 발견했다. 자바스크립트는 정말 별로다.
암튼 그래서 BigInt를 적용했더니 바로 100점이 나왔다.
아무래도 내가 배열을 선언할 때부터 Number로 고정해두어서 문제가 발생한 것 같다.
let input = require("fs")
.readFileSync("input.txt")
.toString()
.trim()
.split("\\n");
let city = parseInt(input[0]); // 도시의 수
let kmArr = input[1].split(" ").map(BigInt);
let oilPriceArr = input[2].split(" ").map(BigInt);
let totalPrice = BigInt(0); // 총 비용을 BigInt로 초기화
let minPrice = oilPriceArr[0]; // 첫 번째 도시의 기름값을 초기 최소값으로 설정
for (let i = 0; i < city - 1; i++) {
// 현재 도시에서 다음 도시로 이동할 때, 가장 저렴한 기름값으로 주유
if (oilPriceArr[i] < minPrice) {
minPrice = oilPriceArr[i]; // 더 저렴한 가격이 나오면 갱신
}
totalPrice += minPrice * kmArr[i]; // 최저 기름값으로 필요한 거리만큼 비용 계산
}
console.log(totalPrice.toString()); // BigInt를 문자열로 변환하여 출력

이렇게 여러 번 문제를 풀고 결국 정답을 맞췄는데 시원하지가 않다.
다음에는 이런 실수를 하지 않도록 더 깊게 생각하도록 노력해야겠다.