1. 문제
문제 설명
가로 길이가 2이고 세로의 길이가 1인 직사각형모양의 타일이 있습니다. 이 직사각형 타일을 이용하여 세로의 길이가 2이고 가로의 길이가 n인 바닥을 가득 채우려고 합니다. 타일을 채울 때는 다음과 같이 2가지 방법이 있습니다.
- 타일을 가로로 배치 하는 경우
- 타일을 세로로 배치 하는 경우
예를들어서 n이 7인 직사각형은 다음과 같이 채울 수 있습니다.
직사각형의 가로의 길이 n이 매개변수로 주어질 때, 이 직사각형을 채우는 방법의 수를 return 하는 solution 함수를 완성해주세요.
제한사항
- 가로의 길이 n은 60,000이하의 자연수 입니다.
- 경우의 수가 많아 질 수 있으므로, 경우의 수를 1,000,000,007으로 나눈 나머지를 return해주세요.
2. 접근 방식
처음 문제를 읽고 어떠한 규칙이 존재한다는 생각이 들었다. 규칙을 찾긴 찾았으나 올바르진 못했다. 결론부터 말하면 규칙이 피보나치 수열이라는 것을 알지 못했다. 내가 알아낸 규칙은 일정 수 안에선 적합하나 n값이 어느 수를 넘으면 오답이 발생했다.
피보나치 수열 - https://terms.naver.com/entry.naver?docId=2270442&cid=51173&categoryId=51173
피보나치 수열
이탈리아 수학자 피보나치(Fibonacci)가 발견한 피보나치 수열은 토끼 번식 이야기에서 출발한다. 어떤 남자가 벽으로 둘러싸인 장소에 한 쌍의 토끼들을 둔다. 만약 각 쌍이 두 번째 달부터 매달
terms.naver.com
요약 하자면 1,2행의 값이 1,1 일 때 3행 부터 값은 앞의 두행을 더한 값이 된다.
피보나치 수열인 것만 인지하면 구현 자체는 어렵지 않다.
3. 구현
class Solution {
public int solution(int n) {
int answer = 0;
int[] dp = new int[n+1];
dp[1] = 1;
dp[2] = 2;
for (int i=3; i<=n; i++) {
dp[i] = (dp[i-1] + dp[i-2])%1000000007;
}
answer = dp[n];
return answer;
}
}
4. 정리
dp는 규칙만 잘 찾으면 금방인데 규칙 찾기가 참 어렵다.
'프로그래머스' 카테고리의 다른 글
프로그래머스 - 올바른 괄호 (0) | 2023.06.07 |
---|---|
프로그래머스 - 가장 큰 정사각형 찾기 (0) | 2023.06.01 |
프로그래머스 - 게임 맵 최단거리 (0) | 2023.05.09 |
프로그래머스 - 디펜스 게임 (0) | 2023.05.08 |
프로그래머스 - 미로탈출 (0) | 2023.05.01 |