https://www.acmicpc.net/problem/13305
// test.txt
4
2 3 1
5 2 4 1
sol1
최솟값을 구하듯 오른쪽으로 탐색한다. 더 작은 기름값이 있는 도시가 나올 때까지 현제 도시에서 기름을 채우도록 조건문을 건다.
const [n,a,b] = require('fs').readFileSync('test.txt').toString().trim().split('\n');
let km = a.split(' ').map(BigInt);
let price = b.split(' ').map(BigInt);
let answer = 0n;
let min = price[0];
for(let i=0;i<n-1;i++) {
if(price[i]<=min) {
min = price[i];
}
answer += min * km[i];
}
console.log(String(answer)) //18
1.
입력을 받을 때 BigInt() 를 사용했다. 이번 문제에서 처음 사용해 봤는데 입력받는 범위가 워낙 크다 보니 Number 대신에 쓰는 내장 객체라고 한다.
BigInt는 Number 원시 값이 안정적으로 나타낼 수 있는 최대치인 2^53 - 1보다 큰 정수를 표현할 수 있는 내장 객체입니다.
출처 : mdn
사용 방법으로는 정수뒤에 n을 쓰고 Number() 대신 BigInt()를 쓰기만 하면 된다. 중요한 건 BigInt는 Math() 메서드를 사용할 수 없고 Number와 연산할 수 없다(에러). 즉 같은 자료형으로 변환해야 한다.
let km = a.split(' ').map(BigInt); //BigInt로 변환
.
let answer = 0n; // 숫자를 받게 될 answer 역시 자료형이 같도록 n을 붙여준다.
console.log(String(answer)) //BigInt 자료형은 그냥 출력하면 n이 붙어서 출력된다 (18n) String으로 변환해서 출력 해줘야 한다.
2.
첫번째 도시에서는 무조건 기름을 채워야 하기 때문에 첫 번째 기름 가격 = 최솟값으로 두고 반복문을 돌며 최솟값을 바꿔준다.
for(let i=0;i<n-1;i++) {
if(price[i]<=min) {
min = price[i];
}
answer += min * km[i];
}
마지막 도시에서 기름 넣을 일은 없기 때문에 for문의 범위를 n-1로 해준다. 최솟값을 저장해뒀기 때문에 지금보다 기름이 저렴한 도시가 나올 때까지 현재 도시에서 기름을 채우게 한다.
'Study > Algorithm' 카테고리의 다른 글
<programmers / JavaScript> 신고 결과 받기 (0) | 2022.06.03 |
---|---|
<BEAKJOON / node.js> 1181 단어정렬 (0) | 2022.05.29 |
<BEAKJOON / node.js> 11399 ATM (0) | 2022.05.24 |
[BEAKJOON / node.js] 1931 회의실 배정 (0) | 2022.05.24 |
<BEAKJOON / node.js> 11047 동전 0 (0) | 2022.05.22 |