[백준] 11727: 2xn타일링2

SuKong·2020년 8월 2일
0
post-thumbnail

'11727- 2xn타일링2' 문제로 이동!

👉문제

2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오.
아래 그림은 2×17 직사각형을 채운 한가지 예이다.

👉입력

첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000)

예시 - 8


👉출력

첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다.

예시 - 171


✍내 풀이

import java.util.*;

public class Main {

	static int[] arr = new int[1001];
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		arr[0] = 1;
		arr[1] = 1;
		System.out.println(tiling2n(n));
	}
	
	static int tiling2n(int n) {
		//down-up 방식
		for( int i = 2 ; i <= n ; i++) {
			arr[i] = (arr[i-1] + arr[i-2]*2) %10007;
		}
		return arr[n];
	}
	
	static int tiling2n(int n) {
		//top-down 방식
		if(n <= 2) return arr[n];
		if(arr[n] != 0) return arr[n];
		arr[n] = tiling2n(n-1) + tiling2n(n-2)*2;
		return arr[n];
	}
    
    
}


✍Note


런타임에러만 8번,,
tiling2n함수의 방식을 down up으로만 했다가, top down으로 바꾸기도하고
함수 호출 방식에서 그냥 메인에 때려넣는 방식으로 바꿔보기도하고 온갖 방식으로 바꾸어 봐도 런타임 에러가 나길래 정말 처음부터 살펴보았다.
원인은?! 바로 배열 선언 실수,,

static int[] arr = new int[1000];

이렇게 배열의 크기를 1000으로 필요한 크기보다 작게 선언했었다.
문제에서 n의 범위가 1부터 1000까지였는데, 내 코드에서 arr[1]이 n이 1일때의 경우의 수를 저장하는 구조기 때문에 총 배열의 크기는 1001이여야 한다.

우엥 내시간😥

profile
안녕하세요 🤗

0개의 댓글