백준 1748번: 수 이어 쓰기 1 - javascript
백준 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라고 도출 할 수 있다.
이걸 정리하면…
- 입력한 숫자의 자리 수의 최초값 (10, 100, 1000 등)과 입력값과의 차이를 구해서 해당 자리수를 곱한다.
- 자리 수가 2이상일 경우 1자리수부터 n-1자리수의 경우의 수를 전부 더해준다.
- 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;
}
댓글남기기