본문 바로가기

백준/C++

[Baekjoon/C++] 1357번 - 뒤집힌 덧셈

Baekjoon Online Judge

문제로 이동

 

문제

어떤 수 X가 주어졌을 때, X의 모든 자리수가 역순이 된 수를 얻을 수 있다. Rev(X)를 X의 모든 자리수를 역순으로 만드는 함수라고 하자. 예를 들어, X=123일 때, Rev(X) = 321이다. 그리고, X=100일 때, Rev(X) = 1이다.

두 양의 정수 X와 Y가 주어졌을 때, Rev(Rev(X) + Rev(Y))를 구하는 프로그램을 작성하시오

 

입력

첫째 줄에 수 X와 Y가 주어진다. X와 Y는 1,000보다 작거나 같은 자연수이다.

 

출력

첫째 줄에 문제의 정답을 출력한다.

 


예제 입력 예제 출력
123 100 223
111 111 222
5 5 1
1000 1 2
456 789 1461

풀이

#include <iostream>
#include <cmath>
using namespace std;

// 모든 자리수를 역순으로 만드는 함수
int Rev(int num) {
    int rNum = 0;

    int idx = 0; // num의 길이
    int num1 = num;

    // num 길이 구하기
    for (int i = 0; ; i++) {
        num1 /= 10;
        idx++;

        if (num1 == 0)
            break;
    }

    // 숫자를 역순으로 바꾸기
    for (int i = idx - 1; i >= 0; i--) {
        rNum += num % 10 * pow(10, i);
        num /= 10;
    }

    return rNum;
}

int main() {
    int X, Y;
    cin >> X >> Y;

    // 출력
    cout << Rev(Rev(X) + Rev(Y)) << endl;

    return 0;
}

숫자를 역순으로 만드는 함수를 구현해야 하는 문제이다.

가장 먼저 함수가 실행되면 num이 몇 자리 숫자인지를 구한 뒤 idx에 저장했다. 그 뒤에 for문으로 입력 받은 숫자를 i10으로 나눈 나머지에 i만큼 제곱한 숫자를 곱한 뒤 서로 더하는 식으로 숫자를 역순으로 바꿨다.

여기서 i는 나중에 계산할 수록 작아져야 하므로 idx - 1이라는 숫자를 초깃값으로 사용했다. 또한 10의 0제곱이 계산할 때 필요하므로 i의 범위를 0까지 포함시켰다.