[BAEKJOON] 1065번 한수

JU CHEOLJIN·2021년 7월 26일
0

Algorithm

목록 보기
9/16
post-thumbnail

1065번 한수

문제 보러가기

문제

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

입력

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

출력

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

풀이

const fs = require("fs");
const input = fs.readFileSync("./dev/stdin").toString().split('');
let count = 0;

function compareNumber(numbers) {
  // 한수인지 판단하기 위해 각 자리수를 비교하는 함수!
  let a = numbers[0];
  let b = numbers[1];
  let c = numbers[2];
  return b - a === c - b ? true : false; // 등차수열이면 true 반환!
}

function findSequence(num) {
  if (num < 100) {
    // 2자리수는 모두가 등차수열을 이루는 한수! 그렇기 때문에 숫자 그대로 할당!
    count = num;
  } else {
    // 3자리수는 한수인지 구별이 필요!
    for (let i = 100; i <= num; i++) {
      // 100부터 주어진 숫자까지 반복해야함.
      let number = i.toString().split(""); // 먼저 각 자리수 배열로 치환
      const isSequence = compareNumber(number); // isSequence에 boolean 값 넣기
      if (isSequence) {
        // true라면 한수니까 카운트 1 올려주기!
        count += 1;
      }
    }
    count += 99; // 3자리 수 이상인 경우에는 기본적으로 2자리수인 99개를 더해야한다.
  }
}
findSequence(input);
console.log(count);

이 문제의 핵심은 한수에 대해서 이해를 하는 것이다. 한수는 각 자리수의 차이가 일정한 등차수열을 이루는 수이다. 이 때, 1~99의 경우에는 등차를 비교할 다른 자리수가 없기 때문에 무조건 한수라고 볼 수 있다.

그렇기 때문에 입력받은 값이 100보다 작은 1~99의 경우에는 입력 받은 값을 그대로 한수의 수로서 출력하도록 if 조건문을 사용해서 출력할 count 에 입력을 그대로 할당했다.

만약, 100 이상의 3자리 수라면 한수의 조건을 판별해줘야 하기 때문에 for 반복문을 통해서 100부터 입력값까지 compareNumber() 함수를 실행하도록 했다.

compareNumber() 함수의 경우 각 자리의 수가 등차수열을 이루는 경우에 true를 반환하기 때문에 이를 이용해서 count 의 값을 1씩 올리도록 했다.

마지막의로 3자리 수 이상의 숫자를 입력 받은 경우에는 1~99까지의 한수의 개수와 100 ~ 입력값까지의 한수의 수를 합쳐야하므로 이를 더해서 출력하도록 했다.

profile
사회에 도움이 되는 것은 꿈, 바로 옆의 도움이 되는 것은 평생 목표인 개발자.

0개의 댓글