역시 테스트가 많아야 돼 맞왜틀 계속하다가 이거랑 비슷했던 셀프넘버에서 다른 테스트를 가져오니가 오류가 발생하여 틀린 부분을 알게됨
const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
let input = fs.readFileSync(filePath).toString().trim().split('\n');
let N = Number(input[0]);
let sum = 0;
let answer = 0;
function pro(num) {
let n = num;
let str = String(n).split('');
if(sum >= N) {
answer = n-1;
return sum;}
sum = n;
str.forEach(e => {
sum += Number(e);
})
return pro(num+1);
}
const result = pro(N/2);
(result === N) ? console.log(answer) : console.log(0);
이코드를 조금조금 수정한 재귀방법은 계속 런타임 에러 (StackSizeExceeded)가 떴다. 재귀함수로 하는 방법 있는지 찾아보기!
const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
let input = fs.readFileSync(filePath).toString().trim().split('\n');
let N = Number(input[0]);
let sum = 0;
let n = 0;
let answer = 0;
while(sum < N) {
sum = n;
let str = String(n).split('');
str.forEach(e => {
sum += Number(e);
})
if(sum === N) {
answer = n;
}
n++;
}
console.log(answer);
여기서 테스트를 101로 넣어보니 이상한 점이 발견됐다. 101의 생산자는 91, 101 두 가지 숫자이다. 처음 나의 판단은 0부터 N이 되거나 넘을때까지면 작은 수가 바로 나오겠지??? 이런 생각을 했는데 87에서 이미 sum이 102가 되어 중단된다. 생산자가 나오기도 전에 중단되는 심각한 오류가 발생하는 것이다. 이를 해결하기 위해 sum <= N까지 의 조건을 n !== N으로 수정했다.
const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
let input = fs.readFileSync(filePath).toString().trim().split('\n');
let N = Number(input[0]);
let sum = 0;
let n = 0;
let answer = [];
while(n !== N) {
sum = n;
let str = String(n).split('');
str.forEach(e => {
sum += Number(e);
})
if(sum === N) {
answer.push(n);
}
n++;
}
let min = answer[0];
answer.forEach(e => {
if(min > e) {
min = e;
}
});
(answer.length > 0) ? console.log(min) : console.log(0);
설명하자면
1. n의 각 자리수를 더한 값을 sum변수에 담는다.
2. sum이 N과 동일하면 answer배열에 담는다.
3. 담겨진 배열에서 가장 작은 수(min)를 구한다(배열이 빈거면 undefined가 나옴)
4. answer배열 길이가 0이상이면 min을 출력하고 아니면 0을 출력