[백준] 2231 분해합 Node.js

Janet·2023년 11월 16일
0

Algorithm

목록 보기
297/314

문제

어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이 된다. 따라서 245는 256의 생성자가 된다. 물론, 어떤 자연수의 경우에는 생성자가 없을 수도 있다. 반대로, 생성자가 여러 개인 자연수도 있을 수 있다.

자연수 N이 주어졌을 때, N의 가장 작은 생성자를 구해내는 프로그램을 작성하시오.

입력

첫째 줄에 자연수 N(1 ≤ N ≤ 1,000,000)이 주어진다.

출력

첫째 줄에 답을 출력한다. 생성자가 없는 경우에는 0을 출력한다.

예제 입력 1

216

예제 출력 1

198

문제풀이

✅ 답안 #1: 메모리 9956 KB, 속도 224 ms

  • sumOfDigits 함수의 매개변수 numbercreator 변수의 각 자릿수이다.
  • number % 10
    • 이 연산은 number의 일의 자리 숫자를 가져온다. 예를 들어, 123 % 10은 3을 반환한
  • sum += number % 10
    • sum에 현재 자릿수의 숫자를 더한다.
  • number = Math.floor(number / 10)
    • number를 10으로 나눈 몫을 새로운 number로 업데이트한다. 이렇게 하면 다음 자릿수로 이동할 수 있다. 예를 들어, 123 / 10은 12.3이지만 Math.floor 함수를 사용하면 12가 된다. 다시 말해, number에서 일의 자리를 제거하는 효과가 있다.
  • 이 과정을 통해 sum에는 number의 각 자릿수를 더한 결과가 저장된다. 이렇게 해서 분해합을 계산할 수 있다.
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
const n = Number(require('fs').readFileSync(filePath).toString().trim());

function sumOfDigits(number) {
  let sum = 0;
  while (number > 0) {
    sum += number % 10;
    number = Math.floor(number / 10);
  }
  return sum;
}

let result = 0;
let creator = n;

while (creator > 0) {
  if (creator + sumOfDigits(creator) === n) {
    result = creator;
  }
  creator--;
}

console.log(result);

✅ 답안 #2: 메모리 9592 KB, 속도 116 ms

  • let start = N - String(N).length * 9;
    • String(N).length * 9는 각 자릿수의 합인데 각 자릿수가 각각 최대로 9일 때를 더한 것이다.
    • 예시) N이 세자리 숫자일 때,
      • 생성자 + 9 + 9 + 9 = 분해합
      • 생성자 = 분해합 - (3 * 9)
  • for (let i = start; i <= *N*; i++) {}
    • 따라서 이 숫자부터 반복문에서 i의 초기값으로 설정한다.
      • N = 256이면, 256 - (3 * 9) = 229이다.
      • 따라서, 229에서부터 256까지의 숫자 사이에 생성자가 존재한다.
  • const sum = i + [...String(i)].reduce((*acc*, *cur*) => *acc* + +*cur*, 0);
    • 생성자와 각 자릿수를 더하여 sum 변수에 저장한다.
  • if (sum === *N*) return i;
    • sum이 N과 같으면 생성자(i)를 리턴하고 없으면 0을 리턴한다.
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
const n = +require('fs').readFileSync(filePath).toString().trim();

function solution(N) {
  let start = N - String(N).length * 9;
  for (let i = start; i <= N; i++) {
    const sum = i + [...String(i)].reduce((acc, cur) => acc + +cur, 0);
    if (sum === N) return i;
  }
  return 0;
}

console.log(solution(n));
profile
😸

0개의 댓글