본문 바로가기

백준/C++

[Baekjoon/C++] 1748번 - 수 이어 쓰기 1

[백준] 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