[백준] 1748 수 이어 쓰기 1 JavaScript

·2024년 5월 12일

문제

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

1234567891011121314151617181920212223...

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

입력

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

출력

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

예제 입력

15

예제 출력

21

내가 했던 풀이 방법

  1. N이 1자리 수인 경우 즉, N의 길이가 1인 경우, answer은 그대로 N이다.
  2. N이 2자리 수 이상인 경우는 다음과 같이 계산할 수 있다.
    예를 들어 N이 123일 경우, 1자리 수의 자릿수 9×1, 2자리 수의 자릿수 90×2 100~123까지의 자릿수 (N-99)×2이다. 즉 이를 모두 더한 값이 원하는 결과이다.
  3. count에 각 자릿수에 맞는 자릿수가 저장되어 있다. 0번에는 한 자릿수일 때 9개, 두 자릿수일 때 90×2.. for문을 이용해 0부터 N.length-2까지 반복하면서 count[i]의 값을 answer에 저장해준다. 방금 계산한 것이 N이 123일 때 1~99까지를 늘여놓은 자릿수이다.
  4. 100~123까지의 갯수를 구하기 위해 a를 이용한다. a는 ""으로 초기화되었지만, for문을 돌면서 9를 더해주었다. (계산을 편하게 하기 위해 a를 문자열로 하고 후에 Number로 변환해주는 방식을 사용했다.)
  5. N에서 a를 뺀 값에 자릿수를 곱해준다. 123으로 설명하면 123에서 99를 뺀 값에 3(자릿수)를 곱해준다. 구해진 값을 answer에 더해준다.

코드

var fs = require('fs');
let N = fs.readFileSync(0, 'utf-8').toString().trim();

let answer = 0;
let a = '';
let count = [9, 90 * 2, 900 * 3, 9000 * 4, 90000 * 5, 900000 * 6, 9000000 * 7, 90000000 * 8];
if (N.length === 1) {
  answer = Number(N);
} else {
  for (let i = 0; i < N.length - 1; i++) {
    answer += count[i];
    a += '9';
  }
  answer += (N - Number(a)) * N.length;
}

console.log(answer);

회고

처음 방법이랑 비슷하게 생각해내긴 했는데 너무 복잡하게 생각했다. 예를 들어 N이 1234일 때, 999까지의 자릿수는 구했지만, 1000~1234까지의 자릿수를 계산하는 것을 너무.... 돌아돌아갔다. 결국 끝이 안 보여서 다른 사람들의 풀이를 봤는데 공식으로 풀더라.. 조금만 더 예시를 들어서 생각했다면, 유추할 수 있던 공식이었다. 실제로 그와 비슷하게 풀이를 하고 있었고. 조금만 더 문제를 들여다볼 걸 싶긴 했다. 그래도 그 공식 덕에 막혔던 혈이 뚫려서 풀 수 있었다.

profile
Frontend🍓

0개의 댓글