[백준] Baekjoon Online Judge
문제
1부터 N까지의 수를 이어서 쓰면 다음과 같이 새로운 하나의 수를 얻을 수 있다.
1234567891011121314151617181920212223...
이렇게 만들어진 새로운 수는 몇 자리 수일까? 이 수의 자릿수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N(1 ≤ N ≤ 100,000,000)이 주어진다.
출력
첫째 줄에 새로운 수의 자릿수를 출력한다.
예제 입력 | 예제 출력 |
5 | 5 |
15 | 21 |
120 | 252 |
풀이
#include <iostream>
using namespace std;
int countLen(int N);
// 자릿수 구하기
int countLen(int N) {
int len = 0; // 자릿수
int cnt = 1; // 각 숫자의 자릿수
int useNum = 0; // 자릿수를 센 숫자의 개수
for (int i = 10; i <= N; i *= 10) {
int n = i - (i / 10);
len += n * cnt++;
useNum += n;
}
if (useNum != N)
len += (N - useNum) * cnt;
return len;
}
int main() {
int N;
scanf("%d", &N);
printf("%d\n", countLen(N));
return 0;
}
// 자릿수 구하기
int countLen(int N) {
int len = 0; // 자릿수
int cnt = 1; // 각 숫자의 자릿수
int useNum = 0; // 자릿수를 센 숫자의 개수
for (int i = 10; i <= N; i *= 10) {
int n = i - (i / 10);
len += n * cnt++;
useNum += n;
}
if (useNum != N)
len += (N - useNum) * cnt;
return len;
}
자릿수를 구하는 함수이다. 자릿수가 1인 숫자의 수는 9개, 자릿수가 2인 숫자는 90개인데, 이를 가득 채울 수 있다면 반복문을 통해 그 숫자들의 자릿수의 합이 len에 더해지게 된다. 그리고 반복문을 나간 뒤 자릿수를 더하지 않은 수들을 len에 계산해서 더해준 뒤 이를 return하게 된다.
지금보니 i를 10이 아니라 9로 시작하고 int n을 빼도 되었을 거 같다는 생각이 든다.
'백준 > C++' 카테고리의 다른 글
[Baekjoon/C++] 10798번 - 세로읽기 (0) | 2023.05.10 |
---|---|
[Baekjoon/C++] 10825번 - 국영수 (0) | 2023.05.07 |
[Baekjoon/C++] 9656번 - 돌 게임 2 (0) | 2023.05.05 |
[Baekjoon/C++] 1205번 - 등수 구하기 (0) | 2023.04.30 |
[Baekjoon/C++] 2217번 - 로프 (0) | 2023.04.26 |