백준 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 |