본문 바로가기
Programming/Baekjoon

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

by duoxi 2023. 6. 3.

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

 

9095번: 1, 2, 3 더하기

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

www.acmicpc.net


문제

 

 

풀이

가능한 연산은 1을 더하기, 2를 더하기, 3을 더하기 3가지입니다.

1은 [1] 로 1가지, 2는 [1+1, 2]로 2가지, 3은 [1+1+1, 2+1, 1+2, 3]으로 4가지, ... 등으로 나올 것입니다.

 

dp 테이블에는 i를 1, 2, 3을 더하여 만들 수 있는 경우의 수가 들어갈 것입니다.

i를 만들기 위해서는 i-1에 1을 더하기, i-2에 2를 더하기, i-3에 3을 더하기 3가지 경우가 있습니다. 따라서 dp[i]는 3가지 경우를 모두 합한 값이 될 것입니다. 이를 점화식으로 나타내면 dp[i] = dp[i-1] + dp[i-2] + dp[i-3]이 됩니다.

 

예를 들어보면 4의 경우에는 1) 3에 1 더하기, 2) 2에 2 더하기, 3) 1에 3 더하기 이기 때문에 

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

 

1) 3에 1 더하기는 다음과 같이 3의 경우에 1을 더하는 경우인 4가지입니다.

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

 

2) 2에 2 더하기는 다음과 같이 2의 경우에 2를 더하는 경우인 2가지입니다.

  • 1+1+2
  • 2+2

 

3) 1에 3 더하기도 다음과 같이 1의 경우에 3을 더하는 경우인 1가지입니다.

  • 1+3

 

따라서 4는 총 7가지가 나옵니다.

 

 

소스코드

  • n은 11보다 작기 때문에 dp 테이블은 0부터 10까지 나타내므로 길이는 11입니다.
import java.util.*;
import java.io.*;

public class BJ9095 {
	
	// n < 11 (0 ~ 10)
	static int[] dp = new int[11];

	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int T = Integer.parseInt(br.readLine());
		
		for(int t=0; t<T; t++) {
			int n = Integer.parseInt(br.readLine());
			
			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];
			}
			
			System.out.println(dp[n]);
		}
	}

}

'Programming > Baekjoon' 카테고리의 다른 글

[백준] 1003번 - 피보나치 함수 (JAVA)  (0) 2023.06.03
[백준] 1463번 - 1로 만들기 (JAVA)  (0) 2023.06.03