본문 바로가기
알고리즘/코딩 - 백준

[Java][백준][9095번] 1,2,3 더하기

by 주남2 2019. 7. 23.
반응형

문제 설명

정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 7가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다.

  • 1+1+1+1
  • 1+1+2
  • 1+2+1
  • 2+1+1
  • 2+2
  • 1+3
  • 3+1

정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다. n은 양수이며 11보다 작다.

출력

각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다.

 

생각

dp문제처럼 보이고, 사실 n이 커진다면 당연히 dp로만 풀어야 한다. 하지만 위 문제는 n이 11보다 작으므로 bfs를 가지고도 충분히 풀 수 있었다!

 

1에서부터 bfs, 2에서부터 bfs, 3에서 부터 bfs를 해서 각각 1,2,3 씩 더해주며서 n이 만들어 질 때까지 재귀를 하며 n보다 커지면 종료를 하는 식으로 하면 된다! 

 

이 다음문제 부터는 n이 커져서 dp로 풀어야한다.. 그런데 생각보다 어려워서 언제 풀 수 있을까 고민된다.

 

코드

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
40
41
import java.io.BufferedReader;
import java.io.InputStreamReader;
 
public class Main {
    //1,2,3씩 추가가 되므로 dx={1,2,3}으로 만든다.
    static int[] dx = {1,2,3};
    static int n;
    static int count = 0;
 
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    
        int t = Integer.parseInt(br.readLine());
        
        for(int i=0; i<t; i++) {
            n = Integer.parseInt(br.readLine());
            //1,2,3에서 시작하므로 1,2,3에서 bfs를 각각 한다.
            for(int j=1; j<=3; j++) {
                dfs(j);
            }
            
            System.out.println(count);
            count = 0;
        }
    }
    
    static void dfs(int a) {
        //n과 같아지면 count를 추가하고 return 하며, n보다 커지면 바로 return해준다.
        if(a == n) {
            count++;
            return;
        } else if(a > n) {
            return;
        }
        
        for(int i=0; i<dx.length; i++) {
            dfs(a+dx[i]);
        }
    }
 
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
 
반응형