본문 바로가기
Algorithm🐙/BaekJoon

[백준] 2231번: 분해합 -JS

by ZZiwon Choi 2024. 8. 20.

문제

어떤 자연수 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

 

브루트 포스 단계 들어오자 마자 나는 확 어렵게 느껴지느....🥲

다른 블로그들 보니까 이 문제는 쉽다고 하는데 나는 생각하는데 시간이 걸렸다.

일단 분해합이라는 것을 처음 들어봤다. 이 문제는 가장작은 생성자를 찾는 문제인제 처음에는 어떻게 문제를 풀어야 할지 감이 안잡혀서 다른 분들이 올린 코드를 살펴보고 감을 잡았다. 

분해합은 반드시 생성자보다 크기 때문에 0부터 시작하면서 하나씩 생성자가 될 수 있는지 확인 하면서 진행해야 된다. 

 

일단 문제에서 주목해야 할 것

1. 가장 작은 생성자

2. 생성자는 없을수 도 있다. 

이렇게 두가지 같다. 

 

알고리즘을 대충 설명해보자면 

1. 0부터 입력값까지 반복문을 돌린다. (0 부터 시작하는 이유는 가장 작은 생성자를 찾는 문제이기 때문이다.)

2. 반복문 안에서 숫자들을 더해가면서 합이 입력값과 같으면 반복문을 빠져 나온다.

 

코드

let fs=require('fs');
let input=fs.readFileSync('/dev/stdin').toString().trim();
let n=Number(input);
let result=0;

for(let i=0; i<n;i++){
    let sum=0; //합과 입력값을 비교하기 위한 변수
    const candidateV=i; //후보값을 i로 지정해서 하나씩 커지게
    const stringV=candidateV.toString(); //각 자리수의 합을 구하기 위해 문자열로 변환
    for(let j=0; j<stringV.length;j++){ // 각 자리수의 합을 구하기 위한 반복문
        sum+=parseInt(stringV[j]); //합에 각 자리수 합을 일단 더하고, 반복문을 빠져 나가면
    }
    sum+=candidateV; //최종 합에 후보값을 더한다
    if(sum==n){ //최종 합이 입력값과 같으면
        result=candidateV;
        break;
    }
}