문제 분석

1부터 계속해서 찾아나가 보니 규칙이 보였다

앞에있던 것들로 부터 가져온다는 것이다.

내가 그린것보다 더 잘 표현된게 있어서 가져왔다.

[출처] https://lotuslee.tistory.com/43

이 문제는 다이나믹 프로그래밍을 이용하여 풀 수 있다.

dp 1차원 배열을 생성하고, dp[n] 는 정수 n을 1,2,3 의 합으로 나타낼 수 있는 경우의 수를 의미한다.

 

dp[1] 은 1로만 나타낼 수 있으므로 1가지이다.

 

n = 1 일 때,

1

한 가지이므로 dp[1] = 1 이다.

 

n = 2 일 때,

1 + 1

2

두 가지이므로 dp[2] = 2 이다.

 

n = 3 일 때,

1 + 1 + 1

2 + 1

1 + 2

3

총 4가지이므로 dp[3] = 4 이다.

 

n = 4 일 때,

1 + 1 + 1 +1

2 + 1 + 1

1 + 2 + 1

3 + 1

1 + 1 + 2

2 + 2

1 + 3

총 7가지이므로 dp[4] = 7 이다.

그런데 n = 4 인 경우의 수에서 아래의 빨간색 부분의 연산은 dp[3]에 포함된 경우의 수와 같다.

1 + 1 + 1 +1

2 + 1 + 1

1 + 2 + 1

3 + 1

 

아래의 파란색 부분의 연산 역시 dp[2]에 포함된 경우의 수와 동일하다.

1 + 1 + 2

2 + 2

 

아래의 초록색 부분의 연산은 dp[1]에 포함된 경우의 수이다.

1 + 3

 

즉, dp[4] 는 결국 dp[3] + dp[2] + dp[1]을 더한 것과 같다.여기서 얻을 수 있는 점화식은 dp[n] = dp[n-1] + dp[n-2] + dp[n-1] 이 된다.점화식을 얻었으니 이를 이용하여 dp의 값들을 구할 수 있다.

 

 

 

전체 소스

package test;

import java.util.*;
import java.io.*;

public class Main {

	public static void main(String[] args) throws Exception {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		int repeat = Integer.parseInt(br.readLine());

		for (int k = 0; k < repeat; k++) {
			int n = Integer.parseInt(br.readLine());
			int[] array = new int[11];

			array[1] = 1;
			array[2] = 2;
			array[3] = 4;

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

 


문제

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

 

9095번: 1, 2, 3 더하기

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

www.acmicpc.net

'알고리즘(BOJ) > Silver' 카테고리의 다른 글

백준 - 병튼 나이트 1783  (0) 2023.03.26
백준 - 타이핑 25215 (다이나믹)  (0) 2023.03.25
백준 - 이친수 2193 (다이나믹)  (0) 2023.03.18
백준 - 1로 만들기 1463  (0) 2023.03.16
백준 - 물병 1052  (0) 2023.03.14
복사했습니다!