Study/algorithm

[백준/Java/DP] 9095 1, 2, 3 더하기

written by yunwon 2021. 10. 6. 18:07

문제

정수 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) 테이블 정의하기

D[i] = i 를 1, 2, 3의 합으로 나타내는 방법의 수

 

(2) 점화식 찾기

D[4] 의 경우의 수를 생각해보자.

1+1+1+1, 3+1, 2+1+1, 1+2+1 (3을 1,2,3의 합으로 나타내는 방법) +1 , D[3]

1+1+2, 2+2 (2를 1,2,3의 합으로 나타내는 방법) +2, D[2]

1+3 (1을 1,2,3의 합으로 나타내는 방법) +3, D[1]

  ⇒ D[4] = D[1] + D[2] + D[3]

 

(3) 초기값 설정하기

D[1] = 1, D[2] = 2, D[3] = 4

D[i] = D[i - 1] + D[i - 2] + D[i - 3] 이니 초기값이 최소 3개는 주어져야 한다.

 

 

풀이

import java.io.*;

public class Main {
	public static void countSum(int n) {
		int[] dp = new int[11];

		dp[1] = 1; dp[2] = 2; dp[3] = 4;
		for(int i = 4; i <= n; i++)
			dp[i] = dp[i - 3] + dp[i - 2] + dp[i - 1];
		
		System.out.println(dp[n]);
	}

    public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine());

		while(n-- != 0)
			countSum(Integer.parseInt(br.readLine()));
	}
}

 

 

© 참고

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

https://blog.encrypted.gg/974?category=773649

 

9095번: 1, 2, 3 더하기

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

www.acmicpc.net