본문 바로가기

Algorithm

백준 9095 1, 2, 3 더하기 Java

2019년 4월에 동적 프로그래밍으로 풀었었던 1, 2, 3 더하기 문제이다. 

이 문제를 재귀 호출을 통한 완전 탐색으로 푸는 방법을 정리한 글이다.

 

동적 프로그래밍으로 푸는 방법을 모른다면 아래의 글을 보도록 하자.

https://dundung.tistory.com/9?category=744408

 

백준 9095 1, 2, 3 더하기 Java

dp문제는 문제를 잘 읽어보고 푸는 방식을 빨리 캐치하는 것이 중요한 것 같다.. 나에게는 아직 너무나도 미숙한 능력이다. 이 문제는 마지막에 어떤 수가 올 수 있는지가 중요한 문제 였다. 합을 나타낼 때는 수..

dundung.tistory.com

나는 아직 재귀 함수를 잘 다루지 못한다.

연습을 통해 재귀 함수를 잘 다루려고 노력해야겠다..

 

이 문제는 n이 주어졌을 때 이 n을 1, 2, 3의 합으로 나타내는 경우의 수를 출력하는 문제이다.

int go(int sum, int n) 이라는 함수를 만들 것이다.

sum은 현재까지 더해진 값이고 n은 목푯값이다.

 

종료 조건부터 생각하면

sum이 n보다 커지면 종료해야 한다.

if(sum > n){

   return 0;

}

그리고 sum이 n과 같으면 1을 리턴한다.

if(sum == n){

   return 1;

}

마지막으로 모든 경우의 수를 다 돌 수 있도록 재귀 호출을 한다.

int now = 0;

for(int i=1; i <=3; i++){

    now += go(sum+i, n);

}

return now;

 

마지막 부분이 메소드의 핵심 부분인데

재귀 호출이 돌면서 모든 경우의 수를 다 돌아보게 된다.

n이 4라면

go(0, 4)를 처음에 호출하고

go(1, 4)을 그다음 바로 호출하고

1에서 또 가능한 경우의 수

1에서 1을 더했을 때, 2를 더했을 때, 3을 더했을 때

BFS처럼 모든 경우를 순차적으로 다 돌면서

더한 값과 n값이 일치하는 경우에만 1을 리턴하면서 now에 1씩 쌓이게 된다.

 

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
import java.util.Scanner;
 
public class Q9095_ver2 {
 
    static int go(int sum, int n) {
        if(sum > n)
            return 0;
        if(sum == n)
            return 1;
        int now = 0;
        for(int i=1; i<=3; i++) {
            now += go(sum+i, n);
        }
        return now;
    }
    
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int tc = scan.nextInt();
        
        while(tc-- > 0) {
            int n = scan.nextInt();
            System.out.println(go(0, n));
        }
    }
}
 

 

'Algorithm' 카테고리의 다른 글

백준 2352 반도체 설계 Java  (3) 2019.06.11
백준 1759 암호 만들기 Java  (0) 2019.06.11
백준 2251 물통 Java  (1) 2019.06.10
백준 1946 신입 사원 Java  (4) 2019.06.10
백준 1120 문자열 Java  (0) 2019.06.10