문제 링크
풀이
const num = parseInt(require("fs").readFileSync("/dev/stdin").toString());
let start = num - (num+"").length*9;
let answer = 0;
if (start < 0) start = 0;
for (let i=start; i<num; i++) {
if (i.toString().split("").map(n => parseInt(n)).reduce((acc, n) => acc + n, 0) + i === num) {
answer = i;
break;
}
}
console.log(answer);
start는 for문을 시작하기 전에 범위를 줄여 실행시간을 줄이기 위해 설정했다. 자연수 N은 생성자 M에 M의 각 자리 숫자의 합을 더한 값이므로, 각 자리에 올 수 있는 수의 최대인 9를 N의 자릿수만큼 곱한 값은 M의 각 자리 숫자의 합과 무조건 크거나 같다. 그래서 start를 N에서 N의 자릿수*9를 뺀 값으로 설정하면, 불필요한 탐색을 줄일 수 있다.
for 문에서는 start부터 N-1까지 수 중에서 N의 생성자가 되는 수를 찾으면 answer에 저장하고 break로 빠져나온다. 만약 for문이 끝날때까지 생성자를 찾지 못하면 answer은 초기값인 0을 그대로 갖게 된다.
사실 이 문제를 풀 때 계속 통과가 되지 않아 질문글을 올렸었다. 친절하게도 답변이 달렸는데, 그 내용은 require("fs").readFileSync()는 Buffer를 반환하기 때문에 String으로 바꾸어 주어야 한다는 것이었다.
아래는 처음에 작성한 첫 번째 줄 입력부분 코드이다.
const num = require("fs").readFileSync("/dev/stdin"); // 실패
'연습장 > 백준(BOJ) 문제풀이' 카테고리의 다른 글
[백준 5585] 거스름돈 with Node.js (0) | 2021.03.31 |
---|---|
[백준 1920] 수 찾기 with Python (0) | 2021.03.31 |
[백준 9012] 괄호 with Python (0) | 2021.03.30 |
[백준 10828] 스택 with Python (0) | 2021.03.26 |
[백준 10870] 피보나치 수 5 with Node.js (0) | 2021.03.26 |