[JAVA/백준 9095번] 1, 2, 3 더하기
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]);
}
}
}
하나씩 확인하면서 풀어가니까 재밌다!