2026.06.24

문제 설명

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

  • 타일을 가로로 배치 하는 경우
  • 타일을 세로로 배치 하는 경우

예를 들어서 n이 7인 직사각형은 다음과 같이 채울 수 있습니다.

직사각형의 가로의 길이 n이 매개변수로 주어질 때, 이 직사각형을 채우는 방법의 수를 return 하는 solution 함수를 완성해주세요.

제한사항

  • 가로의 길이 n은 60,000이하의 자연수 입니다.

  • 경우의 수가 많아 질 수 있으므로,
    경우의 수를 1,000,000,007으로 나눈 나머지를 return해주세요.

입출력 예

문제 풀이


시간 초과 오류 발생


1차 실행 오류

class Solution {
    public int fibo(int n) {
        if (n <= 2) {
            return n;
        }
        return fibo(n - 2) + fibo(n - 1);
    }
    public int solution(int n) {
        return fibo(n) % 1000000007;
    }
}

나의 코드 & AI 코드

소요 시간: 1시간

시간 복잡도: O(n)O(n)


수학적 규칙을 찾아보던 중,
피보나치 수열과 같은 규칙을 가지고 있다는 것을 알아냄
n == 1일 때, 1
n == 2일 때, 2
n == 3일 때, 3
n == 4일 때, 5
n == 5일 때, 8
n == 6일 때, 13
n == 7일 때, 21
n == 8일 때 34 ...

다만 재귀로 구현하여 시간 초과 오류가 발생하였고,
AI를 통해
DP(Dynamic Programming), 이미 계산한 결과를 저장해서 재사용 하는 방식
를 사용하여 해결함


class Solution {
    public int solution(int n) {
        if (n <= 2) {
            return n;
        }
        int fibo[] = new int[n + 1];
        fibo[1] = 1;
        fibo[2] = 2;
        for (int i = 3; i <= n; i++) {
            fibo[i] = (fibo[i - 2] + fibo[i - 1]) % 1000000007;
        }
        
        return fibo[n];
    }
}

0개의 댓글