가로 길이가 2이고 세로의 길이가 1인 직사각형모양의 타일이 있습니다. 이 직사각형 타일을 이용하여 세로의 길이가 2이고 가로의 길이가 n인 바닥을 가득 채우려고 합니다. 타일을 채울 때는 다음과 같이 2가지 방법이 있습니다.
예를들어서 n이 7인 직사각형은 다음과 같이 채울 수 있습니다.
직사각형의 가로의 길이 n이 매개변수로 주어질 때, 이 직사각형을 채우는 방법의 수를 return 하는 solution 함수를 완성해주세요.
n | result |
---|---|
4 | 5 |
입출력 예 #1
다음과 같이 5가지 방법이 있다.
출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
가로 기준에서 가로 타일은 +2칸씩, 세로 타일은 +1칸씩 더해진다. 이것을 n이 될때까지 번갈아가면서 합하면 된다는 설계 진행
- DFS 사용
- input이 n과 같아질때까지 반복
DFS(input+1)
DFS(input+2)
만약 input이 n을 넘어가는 것은 패스- 위처럼 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 생성
- 초기 값 0 ,1, 2 대입해놓고 시작
- (dpArr[i-2]+dpArr[i-1])% 1000000007 이를 계속 반복하면서 수행하면서 dpArr에 푸쉬
- 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];
}