블로그를 이전하였습니다. 2023년 11월부터 https://bluemiv.github.io/에서 블로그를 운영하려고 합니다. 앞으로 해당 블로그의 댓글은 읽지 못할 수 도 있으니 양해바랍니다.
반응형
문제의 저작권은 백준 알고리즘(https://www.acmicpc.net/)에 있습니다
문제
풀이
const isHanNum = (n) => {
if (n < 10) return true;
let t = n,
prevNum = null,
delta = null;
while (t > 0) {
const curNum = t % 10;
if (prevNum != null) {
const curDelta = prevNum - curNum;
if (delta != null && curDelta !== delta) {
return false;
}
delta = curDelta;
}
prevNum = curNum;
t = parseInt(t / 10);
}
return true;
};
const solution = (input) => {
const n = +input;
return [...Array(n).keys()].reduce((cnt, i) => {
if (isHanNum(i + 1)) return cnt + 1;
return cnt;
}, 0);
};
const print = (input) => console.log(solution(input + ''));
process.stdin.on('data', print);
상세 풀이
10보다 작은 수는 계산 필요없이 한수이다.
const isHanNum = (n) => {
if (n < 10) return true;
// ...중략...
};
이전 값과 현재 값을 빼서 등차 값을 구한다. 그리고, 임의의 숫자가 0이 될때까지 루프를 돌면서 등차 값이 같은지 계속 비교한다.
그 다음 등차 값과 비교해서 같지 않다면, false를 반환한다. 루프 끝까지 돌고 나면 모든 등차가 같다는 뜻이므로 true를 반환한다.
const isHanNum = (n) => {
if (n < 10) return true;
let t = n,
prevNum = null,
delta = null;
while (t > 0) {
const curNum = t % 10;
if (prevNum != null) {
const curDelta = prevNum - curNum;
if (delta != null && curDelta !== delta) {
return false;
}
delta = curDelta;
}
prevNum = curNum;
t = parseInt(t / 10);
}
return true;
};
1부터 주어진 숫자까지 iteration 하면서 "한수"의 개수를 구한다.
const solution = (input) => {
const n = +input;
return [...Array(n).keys()].reduce((cnt, i) => {
if (isHanNum(i + 1)) return cnt + 1;
return cnt;
}, 0);
};
전체 코드
https://github.com/bluemiv/Algorithm/blob/master/baekjoon/nodejs/src/ex01/ex1065.js
풀이 결과
관련 글
2022.07.21 - [Algorithm/Beakjoon] - jest 단위테스트를 이용하여 백준 알고리즘 문제 편하게 풀기
반응형
'Algorithm > Beakjoon' 카테고리의 다른 글
백준 11720번 / 숫자의 합 (nodejs 알고리즘 풀이) (0) | 2022.08.19 |
---|---|
백준 10809번 / 알파벳 찾기 (nodejs 알고리즘 풀이) (0) | 2022.08.17 |
백준 4673번 / 셀프 넘버 (nodejs 알고리즘 풀이) (0) | 2022.08.15 |
백준 4344번 / 평균은 넘겠지 (nodejs 알고리즘 풀이) (0) | 2022.08.14 |
백준 8958번 / OX퀴즈 (nodejs 알고리즘 풀이) (0) | 2022.08.13 |