알고리즘/BAEKJOON

[백준] 11382번 꼬마 정민 - C언어

거북이 코딩 2023. 10. 25. 14:07

백준

꼬마 정민

 

꼬마 정민이는 이제 A + B 정도는 쉽게 계산할 수 있다. 이제 A + B + C를 계산할 차례이다!

 

입력
첫 번째 줄에 A, B, C (1 ≤ A, B, C ≤ 10^12)이 공백을 사이에 두고 주어진다.

출력
A+B+C의 값을 출력한다.

예제 입력 1 
77 77 7777


예제 출력 1 
7931

 

풀이 과정

 

이번 문제는 주어진 수 A,B,C의 범위가 중요합니다. (1 ≤ A, B, C ≤ 10^12) int 의 범위는 21억 밖에 되지 않기 때문에 조 단위의 계산은 하지 못합니다. 때문에 long long 을 써야 합니다. 저는 위 사실을 몰랐기 때문에 다른 방법으로 풀었는데 제가 처음에 푼 방법도 써놓겠습니다.

 

코드 1

#include<stdio.h>
int main(void) {
	long long a, b, c;
	scanf("%lld %lld %lld", &a, &b, &c);
	printf("%lld", a + b + c);
}

 이렇게 간단한 문제를 왜 포스팅하냐 궁금하실 수 있습니다. 제가 문제를 처음 풀때 scanf와 printf에서 long long의 서식문자를 따로 %lld로 지정해주어야 하는것을 몰랐기 때문에, 저는 long long을 이용해서 풀때 서식이 맞지않아서 (아마 int로 계산됐을 것입니다.) 문제가 틀렸습니다. 그래서 문자열로 푸는 문제인줄 알고 문자열로 풀었습니다. 밑에 문자열로 푼 코드도 써놓겠습니다.

 

코드 2

#include<stdio.h>
#include<string.h>
void Sorter(char* arr) {    //문자열 안의 숫자를 계산하기 위해 오른쪽 정렬하고 빈곳은 0으로 채우는 함수
	int i, j = 0, len = strlen(arr);
	for (i = len;i >= 0;i--)
		arr[13 - j++] = arr[i];
	for (i = 0;i < 13 - len;i++)
		arr[i] = '0';
}
void Sumer(char* arr1, char* arr2) {    //문자열1에 문자열2를 더하는 함수
	int i;
	for (i = 12;i >= 0;i--) {
		if (arr1[i + 1] - '0' + arr2[i] - '0' > 9) {
			arr1[i + 1] = arr1[i + 1] - '0' + arr2[i] - '0' - 10 + '0';
			arr1[i]++;
		}
		else
			arr1[i + 1] = arr1[i + 1] - '0' + arr2[i] - '0' + '0';
	}
}
int main(void) {
	char a[14], b[14], c[14], sum[15] = { '0','0','0','0','0','0','0','0','0','0','0','0','0','0' };
	scanf("%s", a);    //숫자 3개를 문자열의 형태로 입력받는다
	scanf("%s", b);
	scanf("%s", c);
	Sorter(a);    //문자열 정렬
	Sorter(b);
	Sorter(c);
	Sumer(sum, a);    //문자열 더하기
	Sumer(sum, b);
	Sumer(sum, c);
	int i = 0, cnt = 0;
	while (sum[i++] == '0')    //답 sum의 0개수 알아내기
		cnt++;
	for (i = cnt;i < 14;i++)    //0이 아닌곳부터 답 출력
		printf("%c", sum[i]);
}

 

마치며

 

 굳이 어려운 길을 가서 풀었지만 그래도 이것도 나름의 의미가 있지 않을까 해서 기록해 두어야 겠다고 생각했습니다. 봐주셔서 감사합니다.