본문 바로가기
C

[C]백준 08.기본수학1: 10757

by 열지희공 2022. 1. 13.

백준 10757

내코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
	char a[10001];
	char b[10001];
	scanf("%s %s", a, b);
	int last_a = strlen(a) - 1;
	int last_b = strlen(b) - 1;
	int num_a;
	int num_b;
	int sum = 0;
	int carry = 0;
	int result;
	int output[10002] = { 0, };
	int cnt = 0;
	for (int i = 0; i < 10002; i++) {
		output[i] = -1;
	}
	while (last_a >= -1 && last_b >= -1) {
		if (last_a < 0 && last_b >= 0) {
			num_b = b[last_b] - '0';
			sum = num_b + carry;
			carry = sum / 10;
			result = sum % 10;
			output[cnt] = result;
			last_b--;
			cnt++;
		}
		else if (last_b < 0 && last_a >= 0) {
			num_a = a[last_a] - '0';
			sum = num_a + carry;
			carry = sum / 10;
			result = sum % 10;
			output[cnt] = result;
			last_a--;
			cnt++;
		}
		else if (last_b < 0 && last_a < 0) {
			if (carry > 0) {
				output[cnt] = carry;
				break;
			}
			break;
		}
		else {
			num_a = a[last_a] - '0';
			num_b = b[last_b] - '0';
			sum = num_a + num_b + carry;
			carry = sum / 10;
			result = sum % 10;
			output[cnt] = result;
			last_a--;
			last_b--;
			cnt++;
		}
	}
	int len = 0;
	for (int i = 1; i < 10002; i++) {
		if (output[i] < 0) {
			break;
		}
		len++;
	}
	for (int i = len; i >= 0; i--) {
		printf("%d", output[i]);
	}
	return 0;
}

a와 b를 문자열로 입력받아준 뒤 각 자리를 더해주는 방식으로 문제를 풀었다. a와 b는 10000자리 수까지 들어올 수 있으므로 a와 b 배열의 크기를 10001로 설정했다. 그 뒤 a와 b의 1의자리 수 위치를 알아내어 그 값을 정수형으로 바꾸어 더해준 뒤 10으로 나눈 몫은 carry에, 나머지는 result에 저장하여 result는 output배열에 담고 carry는 그 앞 자리수들을 더할때 같이 더해준다. a와 b가 같은 자리수가 아닐 수도 있기에 각각의 경우를 예외처리해줬고 output배열에 1의자리수부터 순서대로 넣었기에 이를 역으로 출력하였다.

이 문제는 처음 풀었을 때 런타임에러 OutOfBounds가 발생했다. 이는 컨테이너 또는 배열에서 할당된 경계를 넘어가는 접근이 발생했을 때 나타나는 에러이다. 문제의 조건 중 a, b가 10의 10000제곱 미만이길래 a,b의 자리수가 10000보다 작을 것이라고 생각해서 a, b배열의 크기를 10000으로 설정했어서 발생한 문제였다.

'C' 카테고리의 다른 글

[C]백준 09.기본수학2: 1978  (0) 2022.01.14
[C]백준 08.기본수학1: 1011  (0) 2022.01.14
[C]백준 08.기본수학1: 2839  (0) 2022.01.13
[C]백준 08.기본수학1: 2775  (0) 2022.01.13
[C]백준 08.기본수학1: 10250  (0) 2022.01.12