개발 블로그

백준 9095번: 1, 2, 3 더하기 본문

프로그래밍/백준 문제풀이

백준 9095번: 1, 2, 3 더하기

갹둥 2022. 10. 3. 14:24

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

 

9095번: 1, 2, 3 더하기

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

www.acmicpc.net

이 문제는 조금 어려웠던 것 같다. 알고리즘 분류는 다이나믹 프로그래밍이다. 다이나믹 프로그래밍이란 특정 범위까지의 값을 구하기 위해서 그것과 다른 범위까지의 값을 이용하여 효율적으로 값을 구하는 알고리즘 설계 기법이다.

 

1 = 1 (1개)

 

2 = 1 + 1

   = 2 (2개)

 

3 = 1 + 1 + 1

   = 1 + 2

   = 2 + 1

   = 3 (4개)

 

4 = 1 + 1 + 1 + 1 

   = 1 + 1 + 2

   = 1 + 2 + 1

   = 2 + 1 + 1

   = 2 + 2

   = 1 + 3

   = 3 + 1(7개)

 

n을 1, 2, 3으로 나타낼 수 있는 경우의 수를 S(n)이라고 하면 S(n) = S(n - 3) + S(n - 2) + S(n - 1)이라는 점화식을 얻을 수 있다.

4의 경우를 보면 {1을 1, 2, 3의 합으로 나타 낸 집합들에 3을 추가한거} + {2를 1, 2, 3의 합으로 나타 낸 집합들에 2를 추가한거} + {3을 1, 2, 3의 합으로 나타 낸 집합들에 1을 추가한거}와 같다. 

 

 

n은 11 이하 양수이므로 배열을 만들어 미리 담아둔 후 값을 입력받을 때 마다 StringBuilder에 추가해서 한번에 출력하였다. 

import java.util.*;
public class Main {
	public static void main(String[] args){
		int T, n;
		Scanner sc = new Scanner(System.in);
		T=sc.nextInt();
		
		int[] s = new int[12];
		s[1] = 1;
		s[2] = 2;
		s[3] = 4;
		
		for(int i=4; i<12; i++) {
			s[i] = s[i-1] + s[i-2] + s[i-3];
		}
		StringBuilder sb = new StringBuilder();
		int k;
		for(int i=0; i<T; i++) {
			k = sc.nextInt();
			sb.append(s[k]+"\n");
		}
		System.out.print(sb);
	}
}