Adding Reversed Numbers 

이번 포스팅 문제는 3486번 문제입니다. 이 문제는 탐욕 알고리즘(Greedy Algorithm) 문제인데 이 알고리즘 관점에서 문제를 풀어보기 위해

신경을 많이 썼습니다. 


그리디 알고리즘이란 각 부분적인 상황에서 최적의 해를 선택해나가면서 최종적인 해를 구하는 방법인데 이 결과가 항상 전체 상황의 최적의 해는 

아닐 수 있다는 점을 주의해야 합니다. 


그럼 문제를 풀어보도록 하겠습니다 .


조건

2개의 정수가 주어지고 각 정수를 역순으로 나열(123일 경우 -> 321)한 후 덧셈을 하고 그 덧셈 결과를 다시 역순으로 나열하여 출력하는 문제입니다.

풀이전략

01. 각 정수를 역순으로 변환
02. 변환된 정수를 덧셈
03. 덧셈 결과를 역순으로 변환

구현하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package BackJoon.그리디;
import java.util.Scanner;
/**
 * https://www.acmicpc.net/problem/3486
 * @author troh
 * 
 * INPUT: N case, 2개의 정수
 * OUTPUT: 입력된 각 정수의 역순의 합을 역순 
 */
public class _01_AddingReversedNumbers {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        int testCase = sc.nextInt();
        for(int i=0; i<testCase; i++) {
            int num1 = sc.nextInt();
            int num2 = sc.nextInt();
            int result = getSolution(num1, num2);
            System.out.println(result);
        }
    }
    
    private static int getSolution(int num1, int num2) {
        num1 = reverse(num1);
        num2 = reverse(num2);
        return reverse(num1+ num2);
    } 
    
    private static int reverse(int num) {
        int reverseNum = 0;
        while(num/10 != 0) {
            reverseNum = reverseNum*10 + num % 10;
            num /= 10;
        }
        reverseNum = reverseNum*10 + num % 10;
        return reverseNum;
    }
}
 
cs

배운점..

그리디 알고리즘으로 문제에 접근한다에 대해 고민을 많이 할 수 있었고 사전적 정의를 실제 문제에 적용하는게 쉽지 않았습니다. 
개인적인 생각의 그리디 알고리즘 접근 방법은 "각 단계" 와 "최적의 해"를 정의할 수 있어야 한다고 생각합니다. 제가 구현한 코드에서는
"각 단계" 란 "정수 역변환, 덧셈, 결과 역변환"이고 "최적의 해"란 변환하는 알고리즘 이였던 것 같습니다.

문제가 어려웠던건 아니지만 그리디알고리즘 개념이 잘 잡히지 않네요.. 이상입니다



+ Recent posts