1065 한수

나의 풀이

const fs = require('fs');
const input = fs.readFileSync('dev/stdin').toString().trim();
function d(n) {
  let count = 0;
  for (let i = 1; i <= n; i++) {
    let result = true;
    let preNum = 0;
    let nextNum = 0;
    let distance = 0;
    let initDistance = 0;

    if (i < 100) {
      count++;
    } else if (i < 1000) {
      let number = i;
      for (let j = 0; j < n.toString().length; j++) {
        preNum = number % 10;
        number = Math.floor(number / 10);
        nextNum = number % 10;
        if (j == 0) initDistance = preNum - nextNum;
        if (j < n.toString().length - 1) {
          distance = preNum - nextNum;
          if (initDistance != distance) result = false;
        }
      }
      if (result) count++;
    }
  }
  console.log(count);
}

d(Number(input));

나의 풀이는 이와 같다. 결과는

틀렸습니다.

위 코드 실행결과는 문제에서 제시한 Output 과 동일하게 출력한다. 나는 위 코드가 효율적인 코드는 아니라고 생각한다. 훨씬 간단하고 깔끔하게 풀 수 있는 방법이 있을거라고 생각했기 때문에..

수정한 코드

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

function solution(n) {
  let count = 0;
  for (let i = 1; i <= n; ++i) {
    if (i < 100) {
      count++;
    } else if (i < 1000) {
      const strNum = String(i);
      if (strNum[0] - strNum[1] === strNum[1] - strNum[2]) {
        count++;
      }
    }
  }
  console.log(count);
}

solution(Number(input));

훨씬 간결하고 가독성이 좋아졌다. 1부터 99까지는 모두 한수에 해당하기 때문에 복잡한 비교를 할 필요 없이 count를 증가시켜준다.

각 상황마다의 변수를 생성할 필요없이 하이라이트 된 라인처럼 각 자리수의 차를 비교해 같다면 count 를 증가 시켜주는 것이다.

처음 제출한 코드와 비교하니 이전 코드가 형편없게 느껴진다.