PS/백준

백준 / 백트래킹 / 18429번 / 근손실 / JS

KimMinJun 2023. 12. 7. 01:23

< 문제 바로가기 >

 

18429번: 근손실

웨이트 트레이닝을 좋아하는 어떤 대학원생은, 현재 3대 운동 중량 500의 괴력을 소유하고 있다. 다만, 하루가 지날 때마다 중량이 K만큼 감소한다. 예를 들어 K=4일 때, 3일이 지나면 중량이 488로

www.acmicpc.net

 

const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : '../input.txt';
const input = fs.readFileSync(filePath).toString().split('\n');

const [N, K] = input.shift().split(' ').map(Number);
const WEIGHT_LIST = input.shift().split(' ').map(Number);
const isUsed = Array.from({ length: N }, () => false);
let result = 0;

const solution = () => {
  // 처음에 키트 사용횟수 0, 총 중량 500을 인자로 넘겨준다.
  getPermutation(0, 500);

  console.log(result);
};

/**
 * 순열로 가능한 순서인지 판단하는 함수
 * 
 * @param {number} count 키트를 사용한 횟수
 * @param {number} totalWeight 총 중량
 * @returns 
 */
const getPermutation = (count, totalWeight) => {
  // 만약 총 중량이 500미만이라면 다른 순열을 찾는다.
  if (totalWeight < 500) {
    return;
  }

  // 만약 모든 키트를 다 사용했다면,
  // 위의 조건에 걸리지 않았으므로 결과값에 1을 더해준다.
  if (count === N) {
    result += 1;
    return;
  }

  for (let i = 0; i < N; i++) {
    // 만약 사용한 키트라면 다음 키트를 사용한다.
    if (isUsed[i] === true) {
      continue;
    }

    // 현재 키트를 사용처리 해준다.
    isUsed[i] = true;
    // 키트 사용개수를 1 더해주고, 그 키트의 중량만큼 더하고 K만큼 빼준다.
    getPermutation(count + 1, totalWeight + WEIGHT_LIST[i] - K);
    // 다른 순열을 찾기 위해 키트를 미사용처리 해준다.
    isUsed[i] = false;
  }
};

solution();