티스토리 뷰

문제 설명

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

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

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

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

제한사항

  • 가로의 길이 n은 60,000이하의 자연수 입니다.
  • 경우의 수가 많아 질 수 있으므로, 경우의 수를 1,000,000,007으로 나눈 나머지를 return해주세요.

입출력 예

n result
4 5

입출력 예 설명

입출력 예 #1
다음과 같이 5가지 방법이 있다.

풀이 방법

메모이제이션 기법을 사용해 구현합니다.

메모이제이션 기법에 관한 설명은 아래 링크를 참고해주세요

https://dvpzeekke.tistory.com/71

 

Dynamic Programming VS Memoization

다이나믹 프로그래밍과 메모이제이션 알고리즘을 비교해보겠습니다. 다이나믹 프로그래밍은 모든 subproblem들을 전부 구해야하는 문제에 적용하면 좋습니다. 메모이제이션은 모든 subproblem들을 전부 구해야하는..

dvpzeekke.tistory.com

 

풀이

#include <string>
#include <vector>
#include <cstring>

using namespace std;

int mem[60000 + 1];    

int memFib(int n) {
    if (mem[n] == -1) {
        mem[n] = memFib(n-1) + memFib(n-2);
    }
    
    return mem[n]%1000000007;
}

int solution(int n) {
    int answer = 0;
    
    memset(mem, -1, sizeof(mem));
    mem[1] = 1;
    mem[2] = 2;
    
    answer = memFib(n);
    
    return answer;
}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함