풀이
1. A와 B를 입력
2. A의 크기와 B의 크기를 받아온 뒤, 비교해서 큰 값까지 while(idx < max_idx)
(작은 값으로 돌리면 큰값을 전부 가져오지 못함.)
3. 아까 받아온 크기를 이용해서
A의 맨 마지막 인덱스( A[A_idx] ) + B의 맨 마지막 인덱스( B[B_idx] ) + 자리올림( regroup ) % 10을
sum의 0인덱스부터 순서대로 넣어준다.
4. A의 값 + B의 값 + 자리올림이 10이상이면 regroup = 1, 아니면 regroup = 0
5. sum의 뒤집어서 출력한다.
소스코드 - 재귀함수 사용
재귀함수 : https://dojang.io/mod/page/view.php?id=584
#include <stdio.h> // printf, scanf
#include <string.h> // strlen
void print_reverse(char *s)
{
if (!s)
return ;
if (*(s + 1) != '\0')
print_reverse(s + 1);
printf("%c", *s);
}
void get_sum(char *A, char *B, char *sum)
{
int A_idx, B_idx;
int idx, max_idx;
int a, b;
int n, regroup;
A_idx = strlen(A) - 1;
B_idx = strlen(B) - 1;
max_idx = A_idx > B_idx ? A_idx : B_idx;
idx = 0;
regroup = 0;
while (idx <= max_idx)
{
a = A[A_idx] - '0';
b = B[B_idx] - '0';
n = a + b + regroup;
if (A_idx < 0)
n = b + regroup;
if (B_idx < 0)
n = a + regroup;
sum[idx++] = (n % 10) + '0';
regroup = (n >= 10) ? 1 : 0;
A_idx--;
B_idx--;
}
if (regroup == 1)
sum[idx++] = regroup + '0';
sum[idx] = '\0';
print_reverse(sum);
}
int main(void)
{
char A[10001];
char B[10001];
char sum[10002];
scanf("%s %s", A, B);
get_sum(A, B, sum);
return (0);
}
소스코드 - 배열 뒤집어서 출력
#include <stdio.h> // printf, scanf
#include <string.h> // strlen
char *ft_reverse(char *s)
{
int s_len;
int idx;
char tmp;
s_len = strlen(s);
idx = 0;
while (idx < s_len / 2)
{
tmp = s[idx];
s[idx] = s[s_len - idx - 1];
s[s_len - idx - 1] = tmp;
idx++;
}
return (s);
}
void get_sum(char *A, char *B, char *sum)
{
int A_idx, B_idx;
int idx, max_idx;
int a, b;
int n, regroup;
A_idx = strlen(A) - 1;
B_idx = strlen(B) - 1;
max_idx = A_idx > B_idx ? A_idx : B_idx;
idx = 0;
regroup = 0;
while (idx <= max_idx)
{
a = A[A_idx] - '0';
b = B[B_idx] - '0';
n = a + b + regroup;
if (A_idx < 0)
n = b + regroup;
if (B_idx < 0)
n = a + regroup;
sum[idx++] = (n % 10) + '0';
regroup = (n >= 10) ? 1 : 0;
A_idx--;
B_idx--;
}
if (regroup == 1)
sum[idx++] = regroup + '0';
sum[idx] = '\0';
printf("%s\n", ft_reverse(sum));
}
int main(void)
{
char A[10001];
char B[10001];
char sum[10002];
scanf("%s %s", A, B);
get_sum(A, B, sum);
return (0);
}
회고
- 몇 번의 시도 끝에 성공을 했다.
- 구현 방법은 맞았지만 재귀함수로 출력하는 부분에서 실수를 했다.
- 수정 전 코드로 실행하게 되면 *s == '\0'여부를 확인하고, printf에 '\0'값도 들어가버린다.
12345\0를 출력하려고 할 경우, \054321로 널 문자가 맨 앞으로 위치하게 된다. - 출력상 겉보기에 정답하고 비슷하게 나와서 한참을 고생했다.
// 수정 전
void print_reverse(char *s)
{
if (*s != '\0')
print_reverse(s + 1);
printf("%c", *s);
}
// 수정 후
void print_reverse(char *s)
{
if (!s)
return ;
if (*(s + 1) != '\0')
print_reverse(s + 1);
printf("%c", *s);
}
'알고리즘 > 백준' 카테고리의 다른 글
3009번: 네 번째 점 (c언어) (1) | 2021.03.12 |
---|---|
1929번: 소수 구하기 (c언어) (0) | 2021.02.15 |
1989번: 소수찾기 (0) | 2021.02.14 |
1011번: Fly me to the Alpha Centauri (C언어) (0) | 2021.02.13 |
3190번: 뱀 (C언어) (0) | 2021.02.08 |
댓글