Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

Life Engineering

[BOJ 2133] 타일 채우기 (Java) 본문

Problem Solving

[BOJ 2133] 타일 채우기 (Java)

흑개 2022. 3. 25. 15:07

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

 

2133번: 타일 채우기

3×N 크기의 벽을 2×1, 1×2 크기의 타일로 채우는 경우의 수를 구해보자.

www.acmicpc.net

import java.util.Scanner;

public class Main {
	static int N;
	static int[] dp;
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		N=sc.nextInt();
		dp=new int[N+1];
		if (N>1) {
			dp[2]=3;
		}
		if (N>=4 && N%2==0) {
			dp[N]=func(N);
		}
		System.out.println(dp[N]);

	}
	private static int func(int n) {
		if (n<4 || dp[n]!=0) return dp[n];
		int sum=3*(func(n-2));
		for (int i=4; i<=n-2; i+=2) {
			sum+=(func(n-i)*2);
		}
		dp[n]=sum+2;
		return dp[n];
	}

}

타일의 가로 길이가 N개일때(a(n))=> (N-2)개는 채워져있고 2개를 채워야 할 경우 (3*(a(n-2))) <2개를 채우는 경우는 3가지>

=>(N-4)개는 채워져있고 4개를 채워야 할 경우 (2*(a(n-4))) 가지 ...

=>(N-6)개는 채워져있고 6개를 채워야 할 경우 (2*(a(n-6))) 가지 ...

=>(N-8)개는 채워져있고 8개를 채워야 할 경우 (2*(a(n-8))) 가지 ...

 

이런 식이 도출된다는 것을 알 수 있다.

 

조금 구현이 복잡한데 다른 분(https://kosaf04pyh.tistory.com/236)의 코드를 보니,

dp[31]까지 다 만든 뒤 반복문을 이용해 for문을 4~n까지 돌려줘서 채워주면 된다..재귀로 할 필요 없다.