※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 13245번 문제인 Sum of digits이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/13245 

 

13245번: Sum of digits

A single line with the sum of digits in the sequence [0, 1, ..., n-1, n]

www.acmicpc.net

0부터 N까지의 음이 아닌 (십진수) 정수에 등장하는 모든 자릿수의 합을 구하는 문제이다.

 

k자리수의 각 자리의 합들을 미리 구해둔 다음, 가장 큰 자릿수부터 하나씩 줄여나가는 식의 관계를 찾아 해결할 수 있다.

 

예를 들어, 0부터 375까지의 정수의 모든 자릿수의 합은 0부터 299까지의 자릿수의 합과 300부터 375까지의 3 76개, 그리고 0부터 75까지의의 모든 자릿수의 합으로 계산할 수 있다. 이와 같은 관계를 이용해 문제를 해결하자.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <string>
using namespace std;
typedef long long ll;

string s;
ll dgtsum[18]; // [k]: k자리 수들의 각자리합
ll numcnt[18]; // [k]: k자리 수의 개수(leading zero 포함)

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	numcnt[0] = 1;
	for (ll i = 1; i < 18; i++) numcnt[i] = numcnt[i - 1] * 10;

	dgtsum[0] = 0, dgtsum[1] = 45;
	for (ll i = 2; i < 18; i++) {
		dgtsum[i] = 10 * dgtsum[i - 1] + 45 * numcnt[i - 1];
	}

	cin >> s;
	while (s.length() < 18) s = "0" + s;

	ll ans = 0;
	for (ll i = 0; i < 18; i++) {
		ll tmp = s[i] - '0';
		while (s[i] > '0') {
			ans += (ll)(s[i] - '0' - 1) * numcnt[17 - i] + dgtsum[17 - i];
			s[i]--;
		}
		ans += tmp * (stoll(s) + 1);
	}

	cout << ans;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 13217 // C++] Honey  (0) 2023.05.26
[BOJ 13241 // C++] 최소공배수  (0) 2023.05.25
[BOJ 13242 // C++] Harps and Tails  (0) 2023.05.23
[BOJ 2244 // C++] 민코프스키 합  (0) 2023.05.22
[BOJ 10254 // C++] 고속도로  (0) 2023.05.21

+ Recent posts