[Softeer] 금고털이 JavaScript(Node.js) 풀이
해결 순서
1. 입력을 받는다.
2. 무게당 값이 비싼 순서대로 sort 해준다.
3. sort 한 순서대로 계산 시작. 총 무게에서 계산된 무게를 빼준다. 그리고 총 무게가 0이 되면 계산을 종료한다. 이때 경우의 수를 3가지로 나누었다.
// 입력을 받기 위한 fs 선언 -> 입력값은 input에 배열 형태로 저장됨
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().split('\n');
let totalWeight = Number(input[0].split(' ')[0]); // 입력받은 값에서 총 무게 가져오기
let sum = 0; // 정답으로 제출할 sum 변수 생성
let arr = []; // 무게당 값이 비싼 순서대로 정렬된 배열을 저장할 곳
// 입력된 값이 '90 1' 이런 형태로 되어있을 텐데, 그걸 [90, 1] 이렇게 배열로 변환해줌
for(let i=1; i<input.length; i++){
arr.push(input[i].split(' '));
}
// 금속 가격이 비싼 순서대로 정렬함. 위에서 생성한 배열에서 두번째 원소가 금속의 가격이므로 Number(b[1])-Number(a[1]) 기준으로 정렬
arr = arr.sort((a,b) => Number(b[1])-Number(a[1]));
// 계산 시작
for(let i=0; i<arr.length; i++){
// 반복문을 순환하다가 총 무게가 0이 되면 (계산이 끝나면) 반목문 종료
// 배낭에 더이상 금속을 넣을 수 없는 상태면 계산을 종료해야 하기 때문
if(totalWeight === 0) break;
// 현재 탐색 중인 금속의 무게, 가격
const currentWeight = Number(arr[i][0]);
const cost = Number(arr[i][1]);
// Case1: 만약 해당 금속을 모두 배낭에 담아도 배낭이 넘치지 않는다면?
if(currentWeight*cost <= totalWeight){
sum += currentWeight*cost;
totalWeight -= currentWeight*cost;
}else{
// Case2: 주어진 금속을 모두 배낭에 넣을 수 없는 경우
const a = Math.floor(totalWeight/currentWeight);
if(a > 0){
sum += currentWeight*cost;
totalWeight -= currentWeight;
}else{
const r = totalWeight%currentWeight;
sum += r*cost;
totalWeight -= r;
}
}
}
console.log(sum);
테스트케이스 2, 4, 5에서 계속해서 에러가 나다가 결국에 해결했다. 런타임 문제는 아니었고 계산이 틀렸었던 것 같다.
내가 직접 추가해본 테스트 케이스는
100 1
50 2
결과: 100
1000 2
100 5
100 8
결과: 1300
이렇게 두 가지이다. 이걸 해결하니 2, 4, 5도 같이 해결되었다!!
'코딩테스트' 카테고리의 다른 글
[Softeer] 바이러스 JavaScript(Node.js) 풀이 (0) | 2024.02.02 |
---|---|
[Softeer] 8단 변속기 JavaScript(Node.js) 풀이 (0) | 2024.02.02 |