각 자리수가 등차수열을 이루는 숫자를 한수라고 한다.
예) 123 -> 차수가 1인 한수 / 125 -> X
두자리수까지는 모두 한수이다. 어차피 두 개의 수이니까 차수를 비교할 필요가 없다. 무조건 한수이다!
그래서 세자리 수부터만 한수를 구하는 함수를 사용해보려고 했다.
여기서 고민이 됐던 것은 문제에서 1000보다 같거나 작은 수가 주어진다고 해서, 그냥 두번째, 첫번째 차이 === 세번째, 두번째 차이 이런 식으로 구할지, 아니면 네자리 수 이상에서도 구할 수 있게 할지.
물론 전자로 풀고 싶었으나 그래도 의미를 두기 위해 후자의 방법으로 풀기로 했다.
n = n.toString();
input을 각 자리수로 쪼개기 위해서 String으로 변환해주었다.
(안그러면 js에서 자동 형변환을 해주는 과정에서 자꾸 이상하게 되길래 ...)
if (n.length >= 3) {
temp = n.split('');
const diff = temp[1] - temp[0];
for (let i = 1; i < (temp.length-1); i++) {
let tempDiff = temp[i+1] - temp[i];
// 같지 않으면 바로 return
if (!(tempDiff === diff)) return;
}
return temp;
}
어차피 밑에 함수를 실행할 때 세자리 수일 때만 함수를 실행하도록 하였지만 그래도 세자리 수 이상일 때만 for문이 동작하도록 작성했다.
변수 diff는 차수이다.
그래서 for문을 돌면서 (2, 3)번째 (3, 4)번째 ... 의 차수를 구하면서 처음에 구한 차수와 다르면 바로 for문을 종료시킨다.
마지막까지 차수가 모두 같으면 temp 값을 리턴한다.
(개수만 구하는 문제여서 그냥 1 같은 값을 리턴해도 될 것 같았지만 좀 더 확장성 있는 코드를 위해 temp 값을 반환했다.)
let cnt = 0;
if (input < 100) {
cnt = input;
} else {
cnt = 99;
for (let i=100; i <= input; i++) {
cnt = (solve(i) ? cnt+1 : cnt);
}
}
console.log(cnt);
두자리 수 이면 cnt에 자기 자신, input을 넣어준다.
그 이상일 경우 위에 작성해준 solve() 함수를 100부터 자기 자신까지 반복하도록 한다.
한수이면 solve()에서 temp가 그대로 리턴되었으니 그 경우 cnt를 +1 해주고, 아닌 경우 undefined가 리턴 되기 때문에 cnt 그대로 다시 지정한다.
// 백준 1065번 한수
const fs = require('fs');
const input = fs.readFileSync("input.txt").toString();
function solve(n) {
let result = 0;
let temp = [];
n = n.toString();
// 세자리 수 이상일 때만 자리수 쪼개기
// 두자리 수까지는 모두 한수이다.
if (n.length >= 3) {
temp = n.split('');
const diff = temp[1] - temp[0];
for (let i = 1; i < (temp.length-1); i++) {
let tempDiff = temp[i+1] - temp[i];
// 같지 않으면 바로 return
if (!(tempDiff === diff)) return;
}
return temp;
}
}
let cnt = 0;
if (input < 100) {
cnt = input;
} else {
cnt = 99;
for (let i=100; i <= input; i++) {
cnt = (solve(i) ? cnt+1 : cnt);
}
}
console.log(cnt);