알고리즘 공부/프로그래머스

(Java)프로그래머스 코딩테스트 연습 - 연습문제 - 2 * n 타일링

HRuler 2020. 12. 20. 14:13

1. 문제

https://programmers.co.kr/learn/courses/30/lessons/12900#qna

 

코딩테스트 연습 - 2 x n 타일링

가로 길이가 2이고 세로의 길이가 1인 직사각형모양의 타일이 있습니다. 이 직사각형 타일을 이용하여 세로의 길이가 2이고 가로의 길이가 n인 바닥을 가득 채우려고 합니다. 타일을 채울 때는

programmers.co.kr

2. 나의 풀이

    //연습문제 - 2 * n 타일링
    public int solution100(int n) {
    	int ans = 0;
    	
    	int i = 3;
    	int n_1 = 1;
    	int n_2 = 2;
    	
    	while(i < n) {
    		ans = (n_1 + n_2) % 1000000007;
    		n_1 = n_2;
    		n_2 = ans;
    		i++;
    	}
    	ans = (n_1 + n_2) % 1000000007;
    	
        return ans;
    }
    /* 재귀를 사용하니 시간 초과 발생
    static int ans = 0;
    public int solution100(int n) {
    	allcase(n, 0);
    	
        return ans % 1000000007;
    }
    
    void allcase(int n, int su) {
    	if(su == n) {
    		ans += 1;
    		return;
    	}else if(su >= n) {
    		return;
    	}
    	allcase(n, su + 1);
    	allcase(n, su + 2);
    	System.out.println("answer : " + ans);
    }
    */

- 피보나치 로직으로 구현할 수 있다는 개념을 잡지 못한 부분이 로직 구현에 오래 걸린 원인

3. 다른 사람 풀이

class TryHelloWorld {

    public int tiling(int n) {
        int a = 1;
        int b = 1;
        for (int i = 0; i < n - 1; i++) {
            int fib = (a + b) % 100000;
            a = b;
            b = fib;
        }
        return b;
    }

    public static void main(String args[]) {
        TryHelloWorld tryHelloWorld = new TryHelloWorld();
        //아래는 테스트로 출력해 보기 위한 코드입니다.
        System.out.print(tryHelloWorld.tiling(2));
    }
}