[백준/BOJ] 9506번 약수들의 합 [javascript/Node js]

2023. 8. 28. 16:36코딩 테스트 (BOJ)

9506번: 약수들의 합 (acmicpc.net)

 

9506번: 약수들의 합

어떤 숫자 n이 자신을 제외한 모든 약수들의 합과 같으면, 그 수를 완전수라고 한다. 예를 들어 6은 6 = 1 + 2 + 3 으로 완전수이다. n이 완전수인지 아닌지 판단해주는 프로그램을 작성하라.

www.acmicpc.net

이번 문제는 풀면서 알고리즘을 구상하는 사고력이 늘었다기 보다는 javascript는 이런 것도 있구나 알게된 점이 더 컸다.

 

문제풀이

n의 약수중 본인을 제외한 가장 큰 약수는

짝수일 경우에는 1을 제외한 가장 작은 약수인 2로 n을 나눈 값과 같을 것이고,

홀수일 경우에는 2로 나눈 값보다 작을 것이다.

 

그러니 1부터 n을 2로 나눈 값까지만 범위를 잡고 for문을 실행해도 모든 약수를 탐색할 수 있다.

 

이제 for문 안에서 measure[] 라는 배열에  n의 약수인지를 확인 후 맞다면 넣어준다.

 

그리고 마지막에 measure 배열의 원소들을 다 합한 값이 n과 일치하면 문제에서 제시한 양식에 맞춰 출력해주면 끝이다.

전체코드
const fs = require("fs");

const input = fs.readFileSync("../input.txt").toString().trim().split("\n");

for (let i = 0; i < input.length; i++) {
  if (Number(input[i]) == -1){
    break;
  }

  var measure = [];
  let n = Number(input[i]);

  for (let j = 0; j <= n / 2; j++) {
    if (n % j == 0) {
      measure.push(j);
    }
  }

  var sum = measure.reduce((acc, currentValue) => acc + currentValue);

  if (sum == n) {
    process.stdout.write(n + " = " + measure[0]);
    for (let k = 1; k < measure.length; k++) {
      process.stdout.write(" + " + measure[k]);
    }
    console.log("");
  } else {
    console.log(n + " is NOT perfect.");
  }
}
이 문제를 풀며 새로 배운것

1. 개행 없이 출력하고 싶다면 - process.stdout.write()를 사용한다.

2. 배열의 reduce()라는 내장함수를 사용하여 for문 없이도 배열의 모든 원소의 합을 구할 수 있다.

3. javascript는 기본 배열이 가변형이다.