오늘 푼 문제는 각 도시마다 기름값이 다른데 N개의 도시를 모두 돌 수 있는 최소 기름값을 구하는 문제였다.

생각보다 문제가 길고 조건이 많아서 이해하는데 시간이 오래 걸렸다.

핵심은 최소값을 이용하는 것인데 이 부분을 캐치하지 못해서 시간을 많이 낭비했다.

스크린샷 2024-08-12 오후 11.32.43.png

스크린샷 2024-08-12 오후 11.33.34.png

이건 내가 처음 푼 코드다.

이렇게 풀고 나서 채점을 해봤더니 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를 문자열로 변환하여 출력

스크린샷 2024-08-13 오전 1.12.47.png

이렇게 여러 번 문제를 풀고 결국 정답을 맞췄는데 시원하지가 않다.

다음에는 이런 실수를 하지 않도록 더 깊게 생각하도록 노력해야겠다.