본문 바로가기
Data science/알고리즘 학습

SWEA 5604 : 구간합[D4] (C++)

by ggoboogi_house 2022. 3. 30.
반응형

**문제 풀이 방법

- 입력된 숫자의 각 자리수를 더해줘야 하므로, modular 연산(나머지를 사용하는)을 사용한다.
- 0~9 자리수 배열을 만든 후, 해당 자리의 값이 몇 번 등장하는지 count 한다.

* Java 코드로 친절한 문제풀이를 해주신 은서파님께 감사드립니다.
https://goodteacher.tistory.com/403
https://tv.naver.com/v/22678458

*** 코드

#include <stdio.h>

using namespace std;

typedef long long ll;

ll arr[10];

void parse(ll x, ll delta) {	// 숫자 x의 각 자리수에 delta 만큼 count 증가
	while (x > 0) {
		arr[x % 10] += delta;
		x /= 10;
	}
}

int main() {
	//freopen("input.txt", "r", stdin);

	int TC;
	scanf("%d", &TC);

	for (int tc = 1; tc <= TC; tc++) {
		
		// 배열 초기화
		for (int i = 1; i < 10; i++) {
			arr[i] = 0;
		}
		
		ll A, B;
		scanf("%lld %lld", &A, &B);

		ll delta = 1;
		
		while (A <= B) {
			for (;  ((A % 10 != 0) && (A <= B)); A++) {
				parse(A, delta);
			}
			for (;  ((B % 10 != 9) && (A <= B)); B--) {
				parse(B, delta);
			}
			if (A > B) break;

			A /= 10;
			B /= 10;
			ll rows = B - A + 1;
			for (int i = 0; i < 10; i++) {
				arr[i] += rows * delta;
			}
			delta *= 10;
		}

		// 결과구하기
		ll sum = 0;
		for (int i = 1; i < 10; i++) {
			sum += i * arr[i];
		}

		printf("#%d %lld\n", tc, sum);

	}

	return 0;
}

 

**** 주의할 점

- 입력되는 A, B의 값이 10^15보다 작은 값이므로 A, B의 자료형을 int 보다 큰 범위를 사용한다.

 

 

<Reference>

- https://swexpertacademy.com/main/main.do

- https://goodteacher.tistory.com/403

- https://tv.naver.com/v/22678458

반응형