728x90
문제 링크 : www.acmicpc.net/problem/1748
문제
1부터 N까지의 수를 이어서 쓰면 다음과 같이 새로운 하나의 수를 얻을 수 있다.
1234567891011121314151617181920212223...
이렇게 만들어진 새로운 수는 몇 자리 수일까? 이 수의 자릿수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N(1 ≤ N ≤ 100,000,000)이 주어진다.
출력
첫째 줄에 새로운 수의 자릿수를 출력한다.
접근 방법
입력받은 N을 10, 100, 1000으로 나눈 몫에 따라 경우를 나누어 생각해준다.
case 1) 몫 q가 0보다 클 때는 1~9, 10~99, 100~999과 같이 full로 자리수를 카운팅해준다.
case 2) q가 0이 되면 10~N, 100~N, 1000~N 과 같이 N까지 끊어서 자리수를 카운팅해준다.
예를 들어 N=120일때를 보자.
x = 1일 때, 120/10^1 = 12이므로 0보다 크고 따라서 1~9까지 쭉 썼을 때 자리수는 9개이다. (9 = (10^x - 10^x-1) * 1)
x = 2일때, 120/10^2 = 1이므로 0보다 크고 따라서 10~99까지 쭉 썼을 때 자리수는 (99-10 + 1) * 2 개이다.
x = 3일때, 120/10^3 = 0이므로, 이때는 999까지 쓰기 전에 N이 나오기 때문에 100~120까지 썼을 때 자리수는 (120-100+1) * 3 개이다.
#include <iostream>
#include <cmath>
using namespace std;
int main(){
int N;
cin >> N;
int x = 1;
int ans = 0;
while(1){
int q = N/pow(10,x);
if(q>0){
ans += (pow(10,x)-pow(10,x-1)) * x;
}
else{
ans += (N-pow(10,x-1) + 1) * x;
break;
}
x++;
}
cout << ans << "\n";
return 0;
}
728x90
'Algorithm(BOJ) > Brute Force' 카테고리의 다른 글
[C++] 백준 6588번 - 골드바흐의 추측 (시간초과 해결) (0) | 2021.01.31 |
---|---|
[C++] 백준 3085 - 사탕 게임 (완전탐색/브루트포스) (0) | 2021.01.30 |
[C++] 백준 9095번 - 1, 2, 3 더하기 (0) | 2021.01.28 |
[C++] 백준 2309 - 일곱 난쟁이 (0) | 2021.01.28 |
[C++]백준 1476번 - 날짜 계산 (0) | 2021.01.27 |