Minwoo Dev.

[백준 10757번] 큰 수 A+B - C99 본문

백준

[백준 10757번] 큰 수 A+B - C99

itisminu 2023. 6. 6. 10:26
728x90
반응형
SMALL

이 문제 생각보다 굉장히 복잡한 문제다.

파이썬이었다면 이렇게 어렵지 않게 해결했을 테지만 C언어로 이 문제를 해결하려니 정수를 담을 수 있는 크기 차이가 커서 난관에 부딪혔다.

인터넷에 검색하던 도중 굉장한 풀이 방식을 찾았다.

문자열 배열을 이용하여 문제를 해결하는 것이다.

숫자를 문자열에 한 자릿수씩 넣고 그 문자열을 역순으로 뒤집는 reserve 함수를 만들어 앞에서부터 숫자가 들어가는 배열의 성질을 정확히 이용한 풀이다.

 

 

위와 같은 방식으로 해결하면 된다.

이 reserve 함수를 만들어 해결하는 소스 코드를 첨부하겠다.

ASCII 코드표를 봐야하는 부분도 있기에 더 자세히 공부해봐야 할 거 같다.

#include <stdio.h>
#include <string.h>

void reverse(char arr[]) //문자열 역순 정렬
{
	int len = strlen(arr);
	for (int i = 0; i < len / 2; i++) 
	{
		char temp = arr[i];
		arr[i] = arr[len - i - 1];
		arr[len - i - 1] = temp;
	}
}

int main() {
	char A[10002] = { 0 };
	char B[10002] = { 0 };
	char res[10003] = { 0 };
	int carry = 0; //자리수 올림
	int len = 0;
	scanf("%s %s", A, B);

	reverse(A);
	reverse(B);

	if (strlen(A) > strlen(B)) //큰수 기준 
	{
		len = strlen(A);
	}
	else
	{
		len = strlen(B);
	}

	for (int i = 0; i < len; i++)
	{
		int sum = A[i] - '0' + B[i] - '0' + carry; //ASCII 코드 보며 이해할 것
		if (sum < 0)//자리수가 다를경우(sum < 0) sum은 -'0'이 한번 더 계산됨(둘중하나는 NULL이므로)
		{
			sum += '0';//그런경우 +'0'을 해서 맞춰준다.
		}
		if (sum > 9)
		{
			carry = 1; //더한것이 9를 넘어가면 그 다음자리수 +1 해줘야하므로
		}
		else
		{
			carry = 0;
		}
		printf("A[%d] = %c , B[%d] = %c\n", i, A[i], i, B[i]);//시각화를 위한 코드
		res[i] = sum % 10 +'0';
	}
	if (carry == 1)
	{
		res[len] = '1';
	}
	reverse(res); //180도 돌려놨던 것을 다시 180도 돌려 원상복구
	printf("%s", res);
	return 0;
}

 

출처 C언어 백준 10757 큰수 A+B 풀이 (tistory.com)

728x90
반응형
LIST

'백준' 카테고리의 다른 글

별 그리기에서 아차 싶었던 나의 복습  (0) 2023.06.06
[백준 2439번] 별 찍기 - 2 - C99  (0) 2023.06.06
[백준 4999번] 아! - C99  (0) 2023.06.06
[백준 4104번] 크냐? - C99  (0) 2023.06.06
[백준 2741번] N 찍기 - C99  (0) 2023.06.06