코딩테스트/JAVA

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

할루솔이 2023. 10. 19. 15:44
반응형

https://www.acmicpc.net/problem/9095

 

9095번: 1, 2, 3 더하기

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

www.acmicpc.net

 

문제

정수 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의 합으로 나타내는 방법의 수를 출력한다.

예제 입력 1

3
4
7
10

예제 출력 1

7
44
274

👉 풀이과정

이 문제는 DP문제다!

DP는 Dynamic Programing으로 중복계산이 일어나지 않도록 결과를 저장하는 문제라고 한다...

사실, DP문제는 처음 풀어봤는데 당연히 못 풀어서 이것저것 찾아보고 드디어 이해했다ㅠㅠ

 

만약 n = 4로 입력했을 경우, 답은 7이다.

dp[0] = 1;

dp[1] = 1;

dp[2] = 2;

dp[3] = 4;

dp[4] = 7;

 

0을 만들기 위한 방법은 1가지 => 값은 1이다.

0

 

1을 만들기 위한 방법은 1가지 => 값은 1이다.

1

 

2를 만들기 위한 방법은 2가지 => 값은 2이다.

1+1 / 2

 

3을 만들기 위한 방법은 4가지 => 값은 4이다.

1+1+1 / 1+2 / 2+1 / 3

 

4를 만들기 위한 방법은 7가지 => 값은 7이다.

1+1+1+1 / 1+1+2 / 1+2+1/ 1+3 / 2+1+1 / 2+2 / 3+1

 

(*여기서 한 가지 궁금한 것!!!

1,2,3 모두 1, 1+1 / 2 , 1+1+1 / 1+2 / 2+1 / 3

이렇게 본인을 포함하는데 왜 4는 포함하지 않을까???

이유는 문제에서 n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오.

라고 되어있기 때문에 3까지만 본인을 포함하고, 4부터는 포함하지 않는 것이다!)

 

그리고,

dp[3] = dp[2] + dp[1] + dp[0] 

dp[4] = dp[3] + dp[2] + dp[1] 

이렇게 값을 확인할 수 있다!

 

다시 코드를 작성해 보면,

1. dp[0] ~ dp[2] 까지 미리 값을 초기화한다.

2. testCase를 입력받는다.

3. 입력한 testCase만큼 반복문을 설정하고

4. dp[2]까지 미리 초기화를 해두었으니, dp[3]부터 시작하기 위해서 i를 3으로 설정한다.

5. dp[3]을 구하기 위해서는 3-1, 3-2, 3-3 이 필요하기 때문에  dp[j-1] + dp[j-2] +  dp[j-3]로 작성한다.

6. 두 번째 반복문이 끝나면 dp[n]을 출력한다.

 

 

📌 제출코드

import java.util.*;
public class Main{
    public static void main(String[] args){
        //dp[4] = dp[3]+dp[2]+dp[1];
        int[] dp = new int[11];
        dp[0] = 1;
        dp[1] = 1;
        dp[2] = 2;
        Scanner scan = new Scanner(System.in);
        int testCase = scan.nextInt();
        for(int i=0;i<testCase;i++){
            int n = scan.nextInt();
            //dp확인
            for(int j = 3; j<=n;j++){
                dp[j] = dp[j-1] + dp[j-2] + dp[j-3];
            }
            System.out.println(dp[n]);
        }

    }

}

 

하나씩 확인하면서 풀어가니까 재밌다!

 

 

반응형