백준 2231번 분해합-JS

yugyeongKim·2021년 10월 31일
0

백준

목록 보기
29/52
post-custom-banner


역시 테스트가 많아야 돼 맞왜틀 계속하다가 이거랑 비슷했던 셀프넘버에서 다른 테스트를 가져오니가 오류가 발생하여 틀린 부분을 알게됨

- 처음 시도한 코드(런타임에러)

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)가 떴다. 재귀함수로 하는 방법 있는지 찾아보기!

- 두번째 시도(while문)

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을 출력

post-custom-banner

0개의 댓글