https://www.acmicpc.net/problem/1065
내 코드
const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
let input = fs.readFileSync(filePath).toString().split('\n');
solution(+input[0]);
// 입력 받은 숫자에 대해 한수를 판별하는 함수
function f(num){
const strNum = String(num);
// 두 자릿수 이하는 비교할 공차가 첫, 두 번째 원소만 해당되므로 true(참)을 반환
if(strNum.length <= 2) {
return true;
}
// 세 자릿수(3개의 값) 이상 부터 한수 체크
const diff = +strNum[1] - +strNum[0]; // 현재 공차
let beforeNum = +strNum[1]; // 이전 후위 피연산자 저장
// 1과 0에 대한 자릿수 비교는 위에서 진행하므로.. i의 값은 2부터 시작한다.
for(let i = 2; i < strNum.length; i++){
// i번째 자릿수의 값이 이전 후위 피연산자를 '-'연산해서 그 공차가 현재 공차와 다르다면
if(strNum[i] - beforeNum !== diff) {
return false; // false(거짓)을 반환
}
// i번째 자릿수의 값을 이전 후위 피연산자로 할당시켜, 다음 반복에 대한 연산을 준비한다.
beforeNum = +strNum[i];
}
// 비교가 중간에 문제 없이 완료되면 true(참)을 반환
return true;
}
function solution(N){
let cnt = 0;
for(let i = 1; i <= N; i ++){
if(f(i)){ // 한수 판별 후 참인 값에 대해 cnt의 값을 증감시킨다.
cnt++;
}
}
console.log(cnt);
}
한수는 각 자릿수의 등차수열을 이루는 수를 말한다. 예를 들어서 123이라는 값을 생각해볼 때,
각 자릿수가 1, 2, 3 의 공차가 1인 등차수열을 이루므로 123이라는 수는 한수가 된다.
즉, 입력 받은 숫자에 대해서 각 앞 뒤 간의 자릿수를 순서대로 공차를 구하고
그것이 등차수열이 이루는지 자릿수를 가공하고 비교해야하는데,
두 자릿수 이하의 숫자에 대해서는 특별히 비교할 필요 없이 한수가 성립되므로,
1000이하의 자연수라고 가정할 때, 세 자릿수 혹은 네 자릿수에 대한 한수 비교를 처리해주면 된다.
'Problem Solving > BOJ' 카테고리의 다른 글
[백준 11720번/문자열] 숫자의 합 - Java (0) | 2021.03.16 |
---|---|
[백준 4344번/1차원 배열] 평균은 넘겠지 - Java (0) | 2021.03.15 |
[백준 8958번/1차원 배열] OX퀴즈 - Java (0) | 2021.03.15 |
[백준 1546번/1차원 배열] 평균 - Java (0) | 2021.03.15 |
[백준 3052번/1차원 배열] 나머지 - Java (0) | 2021.03.15 |