[백준 | Javascript] 1065

박기영·2022년 5월 18일
0

백준

목록 보기
43/127

함수 3단계
1065번. 한수

문제

어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다.

출력

첫째 줄에 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력한다.

예제 입출력

예제 입력 1

110

예제 출력 1

99

예제 입력 2

1

예제 출력 2

1

예제 입력 3

210

예제 출력 3

105

예제 입력 4

1000

예제 출력 4

144

예제 입력 5

500

예제 출력 5

119

solution

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString();

function hansu(num){
  let count = 0;
  
  for(let i = 1; i <= num; i++){
    // 100보다 작은 수는 전부 한수
    if(i < 100){
      count++;
    } else if(i >= 100 && i < 1000){
      let strNum = String(i);
      
      // 각 자릿수를 분리해서 공차를 구한다
      let gap12 = Number(strNum[1]) - Number(strNum[0]);
      let gap23 = Number(strNum[2]) - Number(strNum[1]);
      
      // 공차가 같으면 한수이므로 count가 증가
      if(gap12 === gap23){
        count++;
      }
    }
  }
  // 커스텀 함수를 사용했으므로 return을 안하면 연산이 사라짐. 주의!
  return count;
}

const num = Number(input);
console.log(hansu(num));

해설

등차수열과 한수의 개념을 이해한다면 굉장히 쉬운 문제다.
등차수열은 일정한 공차를 가지고 변화하는 수열을 말한다.
그런데, 1,3 등 한 자리수는 등차수열인가? 맞다.
그러면, 14, 87, 33 등 두 자리수는 등차수열인가? 맞다.
이게 아마 많이들 헷갈렸을 부분이라고 생각한다.
따라서 한 자리수, 두 자리수가 입력될 때는 입력된 숫자까지 전부 다 한수가 되는 것이다.
나는 처음 이걸 활용해서 9, 99를 더하는 코드를 짰는데, 프로그램에서 이런 방식을 걸러내는 것 같다.(조금 더 알고리즘 식으로 작성하길 원하기 때문이라고 하는 것 같다)
자세한 설명은 여기 적는 것보다 코드와 주석을 함께 보는게 이해가 빠를 것 같다.

profile
나를 믿는 사람들을, 실망시키지 않도록

0개의 댓글