문제
코드
function sol(input) {
let answer = 0;
const len = input.length;
const N = +input;
const min = input - len * 9;
for (let i = min; i <= N; i++) {
const str = String(i);
const num =
+str +str.split("")
.map(Number)
.reduce((s, v) => s + v, 0);
if (num === N) {
answer = +str;
break;
}
}
return answer;
}
require("readline")
.createInterface(process.stdin, process.stdout)
.on("line", (line) => {
console.log(sol(line));
})
.on("close", () => {
process.exit();
});
풀이
자연수 N의 분해합은 N + N의 각 자리수를 더한 수를 의미한다.
예를 들면 자연수 123의 분해합은 123+1+2+3=129이다.
여기서 129는 123의 분해합이며, 123을 129의 생성자라고 한다.
자연수 N의 가장 작은 생성자를 구해보자.
생성자가 가장 작을 경우를 생각해봐야 하는데,
각 자릿수는 0~9까지 숫자를 가질 수 있다.
그러므로 생성자가 가장 작은 경우부터 주어진 자연수 N까지 조회해서
처음으로 발견된 생성자가 정답이고 발견되지 않았다면 0이 정답이다.
(엄연히 따지면 맨 앞 자리 숫자는 따로 처리해주는게 맞지만, 큰 차이는 아니니 무시할 수 있다.)
예를 들면, N이 세 자릿수 숫자라면 (N - 9*3 ~ N)까지 조회한다.
주석을 포함한 코드
function sol(input) {
let answer = 0;
const len = input.length; // N의 자릿수
const N = +input; // 문자를 숫자화한 N
const min = input - len * 9; // N - 9 * 자릿수 부터 시작한다.
for (let i = min; i <= N; i++) { // for문에서는 숫자화한 min를 이용한다.
const str = String(i); // 연산에서는 문자열화한 str을 이용한다.
const num =
Number(str) + str.split("")
.map(Number)
.reduce((s, v) => s + v, 0);
// 숫자를 문자열화 한 str의 각 자릿수를 분리해서, map함수로 숫자화, reduce 함수로 모든 자릿수를 더한다.
// 최종적으로 num 변수에는 숫자 i의 분해합이 주어진다.
// 숫자만을 이용한다면 i를 10으로 나눈 나머지와 몫을 갱신해가며 더해줄 수도 있다.
if (num === N) {
answer = i;
break;
} // 가장 먼저 발견된 생성자 i는 가장 작은 생성자이다.
}
return answer;
}
// 백준에서 입력 받기
require("readline")
.createInterface(process.stdin, process.stdout)
.on("line", (line) => {
console.log(sol(line));
})
.on("close", () => {
process.exit();
});
'DS & Algorithm > baekjoon' 카테고리의 다른 글
[백준] 1541번 잃어버린 괄호 - JavaScript(NodeJS) (0) | 2021.07.19 |
---|---|
[백준] 2108번 통계학 - JavaScript(NodeJS) (0) | 2021.07.18 |
[백준] 3055번 탈출 - JavaScript(NodeJS) (0) | 2021.07.07 |
[백준] 1316번 그룹 단어 체커 - JavaScript(NodeJS) (0) | 2021.07.02 |
[백준] 1037번 약수 - JavaScript(NodeJS) (0) | 2021.07.01 |