IT 기획의 길

백준 9095번 1,2,3 더하기 [JAVA] 본문

알고리즘(백준)/DP

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

완벽하기 쉽지 않지만 완벽해지려고 노력해야 한다 2021. 1. 10. 17:51

문제

정수 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문제의 점화식을 어떻게 세우는지 감이 잡히게 된 문제였다. 

 

dp문제에서 가장 중요한것은

 

현재상태의 직전상태를 생각해서 점화식을 만든다는것이다.

 

이게 무슨말이냐면  

 

위 문제는 어떤 정수를 1,2,3의 합으로 나타낼수 있는데 이때 나타낼수 있는 방법이 총 몇가지냐를 묻는 문제다. 

 

예를 들어

 

4를 1,2,3의 합으로 나타낸다고 했을때 현재상태의 직전상태를 생각해서 점화식을 만들어보자.

 

현재상태: 4

직전상태: 4에서 1을 뺀 상태(3), 4에서 2를 뺀 상태(2) 4에서 3을 뺀 상태(1) 으로 총 3개이다 

4가 되기 직전에 1을 더했는지 2를 더했는지 3을 더했는지는 모르니 case를 3가지로 나눌수 있다 

 

4=3+1

4=2+2

4=1+3

-> 이게 정확히 무슨 뜻이냐면

 

dp[4]를 4를 1,2,3의 합으로 나타 낼수 있는 모든 경우의수라고 하였을때 

 

dp[4]=dp[3]+dp[2]+dp[1]을 만족한다

1을 더하는지 2를 더하는지 3을 더하는지는 경우의수와 상관없다

이미 case를 3개 나눈거에서 우리는 모든 경우를 다 따진것이다

 

최종적으로

dp[n]=dp[n-1]+dp[n-2]+dp[n-3]이라는 점화식이 나온다

점화식만 나온다면 구현은 수월해 진다  

 

 

 

 

import java.util.*;
public class Main {
    public static  int [] dp=new int[11]; //메모할 저장소
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int t=sc.nextInt();
        for(int i=0;i<t;i++) {
            int n=sc.nextInt();
            int answer = DP(n);
            System.out.println(answer);
        }
    }


    public static int DP (int n){
        dp[0]=1;
        dp[1]=1;
        dp[2]=2;
        for(int i=3;i<=n;i++){
            dp[i]=dp[i-1]+dp[i-2]+dp[i-3];
        }

        return dp[n];
    }
}