본문 바로가기

Algorithm

백준 2133 타일채우기 Java

타일 채우기 문제이다.

왜 정답률이 35퍼센트인지 모르겠다. 10~19퍼센트는 되야 할 것 같은데..

 

2xn타일링 문제랑 비슷한 문제이다. 그래서 비슷하게 접근했다가 바로 틀려버렸다.

 

마지막 자리에 올 수 있는 타일의 형태는 

이렇게 3가지의 형태라고 생각했고. 저 형태들 앞은 n-2이기 때문에

dp[n] = dp[n-2]*3; 이라고 간단하게 생각했다. 2xn타일링 문제에선 그랬으니까.

하지만 

이렇게도 형태가 나올 수 있고.

 

이렇게도 나올 수 있다.

 

더 나아가 위에 그림에 가로 타일을 추가하고 안에 가로타일을 추가해주는 방법도 있다.

결론적으로 이 문제의 마지막 자리에 올 수 있는 형태는

dp[n-2]*3 + dp[n-4]*2 + dp[n-6]*2 ... dp[0]*2 까지 다 올 수 있는 것이 였다.

점화식 또한 dp[n] = dp[n-2]*3 + dp[n-4]*2 + dp[n-6]*2 ... dp[0]*2 ; 이다.

 

이 것을 어떻게 저 문제만 보고 떠올릴 수 있는지 참 신기하다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int [] dp = new int[n+1];
 
        dp[0= 1;
        for(int i=2; i<=n; i++) {
            dp[i] = 3*dp[i-2];
            for(int j=i-4; j>=0; j-=2)
                dp[i]+=2*dp[j];
        }
        System.out.println(dp[n]);
    }
 
 

'Algorithm' 카테고리의 다른 글

백준 11005 진법 변환 2 Java  (0) 2019.04.15
백준 2609 최대공약수와 최소공배수 Java  (0) 2019.04.15
백준 1699 제곱수의 합 Java  (1) 2019.04.15
백준 2579 계단오르기 Java  (0) 2019.04.14
백준 1912 연속합 Java  (0) 2019.04.12