백준 1748번: 수 이어 쓰기 1 - javascript

1 분 소요

백준 1748번: 수 이어 쓰기 1

문제 설명

1부터 N까지의 수를 이어서 쓰면 다음과 같이 새로운 하나의 수를 얻을 수 있다.

1234567891011121314151617181920212223…

이렇게 만들어진 새로운 수는 몇 자리 수일까? 이 수의 자릿수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N(1 ≤ N ≤ 100,000,000)이 주어진다.

출력

첫째 줄에 새로운 수의 자릿수를 출력한다.

접근

이번문제는 약간 이게 brute force 계열의 문제인가? 생각하면서 풀었던 문제같다.
먼저 1 ~ 9 까지는 한자리 수 밖에 차지하지 않는다.
10 ~ 99 까지는 두자리 수를 차지하고…
100 ~ 999 까지는 세자리 수를 차지한다.
간단하게 120을 예로 들어보면 120은 1~9까지, 10~99까지, 100~120까지로 나누어 구할 수 있다.
이때 자리수는 9x1 + 90x2 + 21x3 = 252라고 도출 할 수 있다.
이걸 정리하면…

  1. 입력한 숫자의 자리 수의 최초값 (10, 100, 1000 등)과 입력값과의 차이를 구해서 해당 자리수를 곱한다.
  2. 자리 수가 2이상일 경우 1자리수부터 n-1자리수의 경우의 수를 전부 더해준다.
  3. 1과2에서 구한 값들을 전부 더해서 출력해 준다.

즉, 맨처음에는 N - 10^(N자리-1) + 1 을 N자리와 곱해주고, 그 다음부터는 1부터 N-1까지 각 자리수와 9, 90, 900 이런식으로 남은 자리수들의 경우의 수를 곱해주면 된다.
설명을 잘 못했는데, 코드를 보면서 이해하면 좀 더 편할 것 같다.

정답 코드

const readline = require('readline');
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});
let input = [];
rl.on('line', function (line) {
  input.push(line);
})
  .on('close', async function () {
  // 답안 작성
  let answer =0;
  answer = write_number(input[0]);
  console.log(answer);
  process.exit();
});

let write_number =function(n){
  let answer = 0, gu = 9;
  answer = n.length * (n - (10**(n.length-1)) +1);
  if(n.length>1){
    for(let i=1;i<n.length;i++){
      answer += i * gu;
      gu *= 10;
    }
  }
  return answer;
}

댓글남기기