[알고리즘] 백준 11726번, 2xn 타일링 JAVA풀이


백준 11726번, 2xn 타일링 JAVA풀이

  • 2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오.

    아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다.

    d[n] = 2 x n 크기의 직사각형을 채우는 방법의 갯수

    • 2 x 0 = 1
      • 공집합도 1개
      • 빈 스트링도 1개
      • 그러므로, 없는 사각형이지만 1개로 구분
    • 2 x 1 = 1

    즉, d[n] = d[n-2] + d[n-1]

    • d[n-2] 의 사각형 오른쪽에 누워진 직사각형 2개가 붙음
    • d[n-1]의 사각형 오른쪽에 세워진 직사각형 1개가 붙음
    //TOP-DOWN
        public static int topDown (int n) {
            if (n == 0 || n == 1) return 1;
            if (d[n] > 0) return d[n];
      
            d[n] = topDown(n-2) + topDown(n-1);
            d[n] %= 10007; // 여기서 10007 나머지계산을 하지 않으면, 이전의 d[n] 도 값이 전부 틀려져버리기 때문에 d[n]을 구할 때 마다 10007의 나머지계산을 진행 후에 저장
      
            return d[n];
        }
    
    //BOTTOM-UP
        public static int bottomUp (int n) {
            d[0] = 1;
            if (n > 0) d[1] = 1;
            for (int i=2; i<=n; i++) {
                d[i] = d[i-2] + d[i-1];
                d[i] %= 10007; // 이 부분도 마찬가지
            }
            System.out.println(d[n]);
            return d[n];
        }
    

    어떻게보면 피보나치랑 비슷하기도 함 :)






© 2018. by HYEON

Powered by HYEON