[Programmers] 2 x n 타일링 - JavaScript

Joosi_Cool·2023년 3월 19일
0

Programmers

목록 보기
43/98
post-thumbnail

문제설명

문제 링크

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

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

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

Imgur

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

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

입출력 예
n result
4 5
입출력 예 설명

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

Imgur

Imgur

Imgur

Imgur

Imgur

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges



설계 과정

가로 기준에서 가로 타일은 +2칸씩, 세로 타일은 +1칸씩 더해진다. 이것을 n이 될때까지 번갈아가면서 합하면 된다는 설계 진행

  • DFS 사용
  1. input이 n과 같아질때까지 반복
    DFS(input+1)
    DFS(input+2)
    만약 input이 n을 넘어가는 것은 패스
  2. 위처럼 DFS함수 생성 후에 DFS(0) 실행


오답 코드

function solution(n) {
    var answer = 0;
    
    function DFS(input){
        if(n===input){
            answer++;
            return;
        }
        else if(input>n){
            return;
        }
        else{
            DFS(input+1);
            DFS(input+2);
        }
    }
    
    DFS(0);
    return answer;
}


결과


시간 초과가 나왔다....



재설계

문제를 틀린 이유를 곰곰히 생각해보니, 중복되는 계산과정이 너무 많았다. 그래서 시간초과가 난 것이라고 생각이 들었다. 이를 해결하기 위해 중복된 계산을 줄일 DP 를 사용하기로 했다.

  • dpArr 생성
  1. 초기 값 0 ,1, 2 대입해놓고 시작
  2. (dpArr[i-2]+dpArr[i-1])% 1000000007 이를 계속 반복하면서 수행하면서 dpArr에 푸쉬
  3. i = n까지 왔다면 그 dpArr(n)을 리턴


정답코드

function solution(n) {
    var dpArr = [0,1,2];
    
    for(var i =3;i<=n;i++){
        dpArr.push((dpArr[i-2]+dpArr[i-1])% 1000000007);
    }
    return dpArr[n];
}


결과

profile
집돌이 FE개발자의 노트

0개의 댓글