본문 바로가기
코딩테스트

[Softeer] 금고털이 JavaScript(Node.js) 풀이

by thedev 2024. 2. 2.

[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도 같이 해결되었다!!