백준 1357 : 뒤집힌 덧셈

Ureca.·2025년 11월 27일

뒤집힌 덧셈 링크 바로가기

알고리즘 재활훈련으로 브론즈2부터 실버4까지 가리지 않고 보는 중에 정수를 문자열로 변환하고, 문자열을 다시 정수로 변환하는 방법. 그리고 숫자를 뒤집는 그런 것들을 다시 기억해내기에 괜찮은 문제였던 것 같아서 정리해본다.

그리고, 문제에서 Rev라는 함수 자체를 주었기 때문에, 이 함수에 대해서 따로 메소드를 만드는 것도 재활훈련에 도움이 되겠다 싶었다.
문제를 푼 이후에 구글링해보면서 여러 코드 도출 방법을 봤으나, 역시 효율 면에서는 그분들의 코드가 좋다는건 확인했고, 제가 푼 방법은 어디까지나 이러한 방식이 있구나- 라는 생각으로 보면 좋을 것 같습니다.

Point : 정수 → 문자, 문자 → 정수, 함수 메서드 생성

        int x = Integer.parseInt(st.nextToken());
        int y = Integer.parseInt(st.nextToken());

        int rev1 = rev(x);
        int rev2 = rev(y);

우선 문제에서 주어졌던 것처럼 입력받은 값을 함수에 넣어 뒤집는 것을 우선한다.

    static int rev(int input) {
        String str = Integer.toString(input);

        StringBuilder sb = new StringBuilder(str);
        String reverse = sb.reverse().toString();

        int revValue = Integer.parseInt(reverse);

        return revValue;
    }

여기서 리팩토링을 들어간다면, 처음 입력값을 int로 받는 것이 아닌 String으로 받았다면,

String str = Integer.toString(input);

해당 코드는 없어도 잘 동작하겠는데, 차근차근 해나간다고 생각하고 리팩토링 없이 제가 처음 생각했던 코드를 그대로 사용했습니다. 이후 다시 코드를 작성한다면, 불필요한 과정이기 때문에 바로 논리를 넘어가면 좋겠습니다.
문자열로 바꾼 이유는 StringBuilder를 사용해 문자 자체를 뒤집기 위해서입니다. 만일, 문자열로 안 바꾸고 정수 그대로 뒤집겠다면 for문 사용해서 반복적으로 뒤집어도 될 듯한데, 뭔가 특별한 조건도 주어지지 않았으면서 그렇게 너무 수학적으로 접근하는 건 비효율적이지 않나...
코드를 돌려보진 않았는데 아마 이런 방식으로 구조가 잡힐 것이라는 생각.

while (num > 0) {
            res = res * 10 + num % 10;
            num /= 10;
        }

딱 보기에도 귀찮은데 StringBuilder 사용해서 reverse()로 뒤집고 toString()으로 붙입시다...

그리고 문자열을 정수로 바꿔서 revValue에 저장한 후에 return해주면 됩니다.
워낙 오랜만에 코딩하는 거라 왜 return 값에 빨간줄이 쳐지나 봤더니... 메서드 만들 때 static void로 되어있었더라...

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");

        int x = Integer.parseInt(st.nextToken());
        int y = Integer.parseInt(st.nextToken());

        int rev1 = rev(x);
        int rev2 = rev(y);

        int addRev = rev1 + rev2;

        int ans = rev(addRev);
        System.out.println(ans);
    }

    static int rev(int input) {
        String str = Integer.toString(input);

        StringBuilder sb = new StringBuilder(str);
        String reverse = sb.reverse().toString();

        int revValue = Integer.parseInt(reverse);

        return revValue;
    }


}

완성코드는 다음과 같습니다.
다른 코드들보다 줄이 많이 길기도 하고 한데, 논리과정은 같다고 봐도 되지 않을까요

profile
한 편의 주마등이 망작이 될 수는 없잖아.

0개의 댓글