알고리즘 공부/DP

백준 9095 (1, 2, 3 더하기)

kdhoooon 2021. 1. 29. 11:49

문제


정수 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의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오.

 

 

 

 

풀이


1 = 1

2 = 1+1, 2

3 = 1+1+1, 1+2, 2+1, 3

4 = 1의 경우에 3을 더함

      2의 경우에 2를 더함

      3의 경우에 1을 더함

5 = 2의 경우에 3을 더함

      3의 경우에 2를 더함

      4의 경우에 1을 더함

...

 

이런식으로 진행되는 걸 점화식으로 나타내면

 

an = an-1 + an-2 + an-3  

 

이 나온다.

 

<Bottom-Up 코드>

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {	
	
	static StringBuilder sb = new StringBuilder();
	
	public static void main(String[] args) throws IOException{
		
	    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
	    
	    int Case = Integer.parseInt(bufferedReader.readLine());
	    
		    for(int j = 0 ; j < Case ; j++) {
		    int n = Integer.parseInt(bufferedReader.readLine());
			
		    int[] dp = new int[12];
		    dp[1] = 1;
		    dp[2] = 2;
		    dp[3] = 4;
		    
		    for(int i = 4 ; i <= n ; i++) {
		    	dp[i] = dp[i-1] + dp[i-2] + dp[i-3];
		    }
		    sb.append(dp[n] + "\n");
	    } 
	    System.out.println(sb);
	}
}

 

 

넥슨 코딩테스트에서 나온 문제와 비슷해서 재귀로도 풀어 보았다.

재귀형식으로 1, 2, 3 을 더해서 해당 값이 나오면 count를 해주는 방식으로 풀었다.\

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {	
	
	static StringBuilder sb = new StringBuilder();
	static int count = 0;
	
	public static void main(String[] args) throws IOException{
		
	    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
	    
	    int Case = Integer.parseInt(bufferedReader.readLine());
	    
		    for(int j = 0 ; j < Case ; j++) {
		    int n = Integer.parseInt(bufferedReader.readLine());
			count = 0;
		    Calculator(0, n);
		    
		    sb.append( count + "\n");
	    } 
	    System.out.println(sb);
	}
	
	static void Calculator(int sum, int n) {
		if( sum == n) {
			count++;
			return;
		}
		else if(sum > n ) {
			return;
		}
		
		
		for(int i = 1 ; i <= 3 ; i++) {
			Calculator(sum+i, n);
		}	
	}
}