πŸ“š μ½”λ”©ν…ŒμŠ€νŠΈ/λ°±μ€€ & ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

[λ°±μ€€][JAVA] 9095번 : 1, 2, 3 λ”ν•˜κΈ° ( *DP )

deep_lee 2023. 3. 5. 13:07

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

 

9095번: 1, 2, 3 λ”ν•˜κΈ°

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ§ˆλ‹€, n을 1, 2, 3의 ν•©μœΌλ‘œ λ‚˜νƒ€λ‚΄λŠ” λ°©λ²•μ˜ 수λ₯Ό 좜λ ₯ν•œλ‹€.

www.acmicpc.net


이 λ¬Έμ œλŠ” λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°μ„ μ΄μš©ν•˜μ—¬ ν’€ 수 μžˆλ‹€.

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의 값듀을 ꡬ할 수 μžˆλ‹€.

 

 

import java.util.*;
import java.math.*;
public class Main {
	
	static int dp[] = new int [11];
	
	public static void main(String[] args)   {
		Scanner kb = new Scanner(System.in);
		
		int t = kb.nextInt();
		dp[1]=1; //초기 κ°’ μ΄ˆκΈ°ν™”
		dp[2]=2;
		dp[3]=4;
		
		for(int j=4;j<=10;j++) { // 4λΆ€ν„° 반볡
			dp[j] = dp[j-3] + dp[j-2] + dp[j-1]; // 점화식
		}
		
		for(int i=0;i<t;i++) {
			int n = kb.nextInt();
			System.out.println(dp[n]);
		}
	}
}