BOJ - 1065 : 한수

Seungrok Yoon (Lethe)·2021년 10월 5일
0
post-thumbnail

1. 문제

문제링크

2. 접근법

완전탐색 문제는 시간 복잡도가 높을 수밖에 없다.

때문에, 모든 경우의 수를 검토하고, 예외 케이스가 있지는 않은지 꼼꼼하게 생각해 보며 문제풀이를 진행했다.

내가 생각했던 풀이 방향은 다음과 같았다.

  • 1부터 주어진 수까지 n을 높여가며, 해당 n이 함수인지 검토한다.
  • 검토 과정에서는 n을 문자열로 바꿔서, 가장 높은 자리수 (인덱스가 가장 낮은 위치에 있는 수)와 그 다음 자리수 사이의 차이(양수 또는 음수)를 구한 후, 인덱스를 높여가면서 다음 자리수가 등차인지를 검증한다. 만약 한 번이라도 등차수열이 아닌 경우에는 해당 수는 한수일 수 없으므로 검증을 중지하고, 다음 수로 넘어간다.

3. 내 풀이

// 백준 1065 - 한수
// 링크: https://www.acmicpc.net/problem/1065

const readline = require('readline')
const r1 = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
})

const solution = () => {
  const n = input.shift()
  findAnswer(n)
  console.log(answer)
  return
}

const findAnswer = (n) => {
  const number = parseInt(n) + 1 // 미만이 아니라 이하인 조건이기 때문.
  for (let i = 1; i < number; i++) {
    const stringNum = '' + i
    if (stringNum.length < 3) {
      answer++
      continue
    }
    if (isAnswer(stringNum)) {
      answer++
    }
  }
}

const isAnswer = (stringN) => {
  const difference = parseInt(stringN[1] - stringN[0])
  for (let i = 1; i < stringN.length; i++) {
    const current = parseInt(stringN[i - 1])
    const next = parseInt(stringN[i])
    if (current + difference !== next) {
      return false
    }
  }
  return true
}

const input = []
let answer = 0
r1.on('line', (line) => {
  input.push(line)
}).on('close', () => {
  solution()
})

4. 키워드 및 교훈

  • ''+숫자 -> 문자열
  • 1~99까지는 무조건 한수이기 때문에, 로직을 건너뛰도록 조치했다.
  • 코드를 작성하다 보면, 작성자인 나조차도 내 코드를 읽기 어려울 때가 있다. 이럴 때는 특정 작업을 함수로 빼서 작성함으로써, 코드의 가독성을 높이면 좋다.
profile
안녕하세요 개발자 윤승록입니다. 내 성장을 가시적으로 기록하기 위해 블로그를 운영중입니다.

0개의 댓글