[level 2] 2 x n 타일링 - 12900
성능 요약
메모리: 52.2 MB, 시간: 1.50 ms
구분
코딩테스트 연습 > 연습문제
채점결과
정확성: 70.0
효율성: 30.0
합계: 100.0 / 100.0
제출 일자
2024년 09월 22일 17:01:06
문제 설명
가로 길이가 2이고 세로의 길이가 1인 직사각형모양의 타일이 있습니다. 이 직사각형 타일을 이용하여 세로의 길이가 2이고 가로의 길이가 n인 바닥을 가득 채우려고 합니다. 타일을 채울 때는 다음과 같이 2가지 방법이 있습니다.
- 타일을 가로로 배치 하는 경우
- 타일을 세로로 배치 하는 경우
예를들어서 n이 7인 직사각형은 다음과 같이 채울 수 있습니다.
직사각형의 가로의 길이 n이 매개변수로 주어질 때, 이 직사각형을 채우는 방법의 수를 return 하는 solution 함수를 완성해주세요.
제한사항
- 가로의 길이 n은 60,000이하의 자연수 입니다.
- 경우의 수가 많아 질 수 있으므로, 경우의 수를 1,000,000,007으로 나눈 나머지를 return해주세요.
입출력 예
n | result |
---|---|
4 | 5 |
입출력 예 설명
입출력 예 #1
다음과 같이 5가지 방법이 있다.
기존에 생각했던 해결 방법
class Solution {
public int solution(int n) {
return tile(n);
}
int tile(int n){
if(n == 1) return 1;
if(n == 2) return 2;
return (tile(n-1)+tile(n-2))%1000000007;
}
}
재귀로 접근하였을 때 시간 복잡도는 O(2^n)로
중복 계산으로 인해 n이 증가할수록 계산 시간이 기하급수적으로 증가하여 시간초과로 문제를 해결하지 못하였다.
해결 방법
DP 방식 적용
시간 복잡도를 O(n)으로 단축시킬 수 있으며, 단순 계산으로 n이 50일때 DP 방식은 50번의 계산만 수행하지만, 재귀 방식은 수백만 번의 함수호출이 필요하다.
class Solution {
public int solution(int n) {
int[] arr = new int[n+1];
arr[1] = 1;
arr[2] = 2;
for(int i=3; i<=n; i++){
arr[i] = (arr[i-1] + arr[i-2]) % 1000000007 ;
}
return arr[n];
}
}
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[level 2] [3차] n진수 게임 - 17687 (0) | 2024.09.26 |
---|---|
[level 2] 튜플 - 64065 (0) | 2024.09.22 |
[level 2] [1차] 캐시 - 17680 (3) | 2024.09.20 |
[level 2] n^2 배열 자르기 - 87390 (0) | 2024.09.15 |
[level 2] 할인 행사 - 131127 (1) | 2024.09.15 |