728x90
문제 설명
가로 길이가 2이고 세로의 길이가 1인 직사각형모양의 타일이 있습니다. 이 직사각형 타일을 이용하여 세로의 길이가 2이고 가로의 길이가 n인 바닥을 가득 채우려고 합니다. 타일을 채울 때는 다음과 같이 2가지 방법이 있습니다.
- 타일을 가로로 배치하는 경우
- 타일을 세로로 배치하는 경우
직사각형의 가로의 길이 n이 매개변수로 주어질 때, 이 직사각형을 채우는 방법의 수를 return 하는 solution 함수를 완성해주세요.
제한사항
- 가로의 길이 n은 60,000이하의 자연수 입니다.
- 경우의 수가 많아 질 수 있으므로, 경우의 수를 1,000,000,007으로 나눈 나머지를 return해주세요.
입출력 예시
n | result |
4 | 5 |
나의 풀이
function solution(n) {
let x=[0,1,2]
for(let i=3;i<=n;i++){
x.push((x[i-1]%1000000007+x[i-2]%1000000007))
}
return x[n]%1000000007
}
풀이 전략
풀이에 손대지 않고 문제만 뚫어지게 보다가 처음에는 n을 1과 2로 나누는 경우의 수를 찾는거라고 생각이 들었다.
그러다가 딱 피보나치..! 가 스쳐지나갔다. n이 3일 경우 2일 경우를 구해서 더해보니 피보나치를 이용하는게 맞았다.
1. 풀이의 편의상 index 0 에는 0을 넣어주었고 x[n]일 때의 값이 각 경우의 수이다.
2. 초기값이 1과 2를 넣어주고 3부터 n까지 반복하며 x[i-1]+x[i-2] 를 push 해준다. 수가 너무 커질 경우에 대비해 문제에 주어진
1000000007 로 나눈 나머지를 넣어준다.
3. return x[n] (역시 %1000000007 해준다.)
review)
무작정 코드치지 말고 잠시 문제 읽으며 어떻게 풀지 생각을 충분히 한 후 코드를 짜는게 훨씬 효율적인 것 같다.
생각만 충분히 해도 반 이상은 풀린다!
728x90