어떤 자연수 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을 출력한다.
216
198
✅ 답안 #1: 메모리 9956 KB, 속도 224 ms
sumOfDigits
함수의 매개변수 number
는 creator
변수의 각 자릿수이다.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;
for (let i = start; i <= *N*; i++) {}
const sum = i + [...String(i)].reduce((*acc*, *cur*) => *acc* + +*cur*, 0);
if (sum === *N*) return i;
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));