BAEKJOON/단계별로 풀어보기

[BOJ] 10757번 : 큰 수 A + B

말하는 알감자 2022. 8. 12. 01:29

🔒 문제

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

⌨ 입력

첫째 줄에 A와 B가 주어진다. (0 < A,B < 1010000)

🖨 출력

첫째 줄에 A+B를 출력한다.

📚 예제

Ex1)

9223372036854775807 9223372036854775808

18446744073709551615

💡반례1)

1 999

1000

💡반례2)

999 1

1000

📌 풀이

신경써야 할 부분

문자열 ans에 각 자리수 합 대입

  1. 일단 세 가지 경우로 나뉨
    1) A문자열 길이 > B문자열 길이
    2) A문자열 길이 = B문자열 길이
    3) A문자열 길이 < B문자열 길이
  2. A와 B의 각 인덱스를 더할 때, 둘의 합이 10을 넘길 수 있음
    => A와 B의 합을 10으로 나눈 나머지를 ans에 대입
    => A와 B의 합을 10으로 나눈 값을 r로 두고 다음 인덱스들끼리 더할때 더해줌 ( r==0 || r==1 )
  3. 1-1,1-3의 경우 1+999 나 999+1의 경우 처럼 일의 자리끼리 더했을때 10 이상이되어 계속해서 앞 자리 수에 1이 더해질 수 있다
  4. 1-2의 경우 A와 B의 가장 큰 자리수 끼리 더했을때 10이 넘는 경우가 있다는 것을 조심
  5. ans에 대입할 때, 일의 자리수의 합이 ans[0]에 저장되고, 가장 큰 자리수의 합이 ans의 마지막 index에 대입되니까, printf 할 때, 거꾸로 맨 뒤에서부터 출력해야함.

+) 참고

  1. 문자 -> 정수 : 문자 - '0'
  2. 정수 -> 문자 : 정수 + '0'

🔑 c언어 코드


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

void sum_print(char* ans);

int main()
{
    char* A, * B, * ans;
    A = malloc(sizeof(char) * 10009);
    B = malloc(sizeof(char) * 10009);
    ans = malloc(sizeof(char) * 10009);
    scanf("%s %s", A, B);
    int a = strlen(A) - 1;
    int b = strlen(B) - 1;
    int c; // c는 A와 B 각 자리수 더한 값 % 10
    int r = 0; // r은 A와 B 각 자리수 더한 값 / 10
    int j = 0; // ans의 index

    if (a > b)
    {
        while (1)
        {
            if (b == -1)
            {
                for (int i = a; i > -1; i--)
                {
                    c = (A[i] - '0') + r;
                    r = c / 10;
                    c = c % 10;
                    if ((i == 0) && (r == 1))
                    {
                        ans[j++] = '0';
                        ans[j++] = '1';
                        break;
                    }
                    ans[j++] = (c + '0');
                }
                break;
            }
            c = (A[a--] - '0') + (B[b--] - '0') + r;
            r = c / 10;
            c %= 10;
            ans[j++] = (c + '0');
        }
        ans[j] = '\0';
    }

    else if (a == b)
    {
        while (1)
        {
            if (b == -1)
                break;
            c = (A[a] - '0') + (B[b] - '0') + r;
            r = c / 10;
            c %= 10;
            if ((a == 0) && (b == 0) && (r == 1))
            {
                ans[j++] = (c + '0');
                ans[j++] = '1';
                break;
            }
            ans[j++] = (c + '0');
            a--;
            b--;
        }
        ans[j] = '\0';
    }

    else
    {
        while (1)
        {
            if (a == -1)
            {
                for (int i = b; i > -1; i--)
                {
                    c = (B[i] - '0') + r;
                    r = c / 10;
                    c = c % 10;
                    if ((i == 0) && (r == 1))
                    {
                        ans[j++] = '0';
                        ans[j++] = '1';
                        break;
                    }
                    ans[j++] = (c + '0');
                }
                break;
            }
            c = (A[a--] - '0') + (B[b--] - '0') + r;
            r = c / 10;
            c %= 10;
            ans[j++] = (c + '0');
        }
        ans[j] = '\0';
    }

    sum_print(ans);
    return 0;
}

void sum_print(char* ans)
{
    int n = strlen(ans);
    for (int i = n - 1; i > -1; i--)
        printf("%c", ans[i]);
}

c언어로 풀면 실3이란 말이 맞았으면 좋겠당,,,ㅜㅠ

'BAEKJOON > 단계별로 풀어보기' 카테고리의 다른 글

[BOJ] 2581번 : 소수  (0) 2022.08.12
[BOJ] 1978번 : 소수 찾기  (2) 2022.08.12
[BOJ] 25304번 : 영수증  (0) 2022.08.11
[BOJ] 3003번 : 킹, 퀸, 룩, 비숍, 나이트, 폰  (0) 2022.08.11
[BOJ] 2839번 : 설탕 배달  (0) 2022.08.11