[백준 문제풀이] 1065 한수 (Javascript)

방예서·2022년 5월 24일
0

코딩테스트 준비

목록 보기
9/37

1065 한수

각 자리수가 등차수열을 이루는 숫자를 한수라고 한다.

예) 123 -> 차수가 1인 한수 / 125 -> X

두자리수까지는 모두 한수이다. 어차피 두 개의 수이니까 차수를 비교할 필요가 없다. 무조건 한수이다!

그래서 세자리 수부터만 한수를 구하는 함수를 사용해보려고 했다.

여기서 고민이 됐던 것은 문제에서 1000보다 같거나 작은 수가 주어진다고 해서, 그냥 두번째, 첫번째 차이 === 세번째, 두번째 차이 이런 식으로 구할지, 아니면 네자리 수 이상에서도 구할 수 있게 할지.

물론 전자로 풀고 싶었으나 그래도 의미를 두기 위해 후자의 방법으로 풀기로 했다.

  • js
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);
profile
console.log('bang log');

0개의 댓글