🪴 Hayul's digital garden

Search

Search IconIcon to open search

멀리뛰기

Last updated Unknown Edit Source

효진이는 멀리 뛰기를 연습하고 있습니다. 효진이는 한번에 1칸, 또는 2칸을 뛸 수 있습니다. 칸이 총 4개 있을 때, 효진이는

1
2
3
4
5
(1칸, 1칸, 1칸, 1칸)  
(1칸, 2칸, 1칸)  
(1칸, 1칸, 2칸)  
(2칸, 1칸, 1칸)  
(2칸, 2칸)  

의 5가지 방법으로 맨 끝 칸에 도달할 수 있습니다.

멀리뛰기에 사용될 칸의 수 n이 주어질 때, 효진이가 끝에 도달하는 방법이 몇 가지인지 알아내, 여기에 1234567를 나눈 나머지를 리턴하는 함수, solution을 완성하세요.

예를 들어 4가 입력된다면, 5를 return하면 됩니다.

제한 사항

입출력 예

nresult
45
33

입출력 예 설명

입출력 예 #1
위에서 설명한 내용과 같습니다.

입출력 예 #2

(2칸, 1칸)
(1칸, 2칸)
(1칸, 1칸, 1칸)

총 3가지 방법으로 멀리 뛸 수 있습니다.

# 문제 풀이

이 문제는 Dynamic Programming을 이용하는 문제이다. dp[n] 은 n칸을 갈 수 있는 방법의 수이다. 그래서 dp[1]부터 dp[n]까지 경우의 수를 찾아 더해준다. 두 번째 for문에서는 1칸만으로 가는 경우의 수를 더해주고, 2칸도 사용해서 가는 경우의 수를 또 더해준다. 

결과적으로, 갈 수 있는 칸이 [1,2] 칸이기 때문에 can-step이 항상 can-1 또는 can-2가 되어 피보나치와 같아지게 된다. 이 코드는 만약 [1,2] 칸이 아니라 더 여러 개의 칸을 갈 수 있는 문제였어도 그대로 적용할 수 있다. 

피보나치로 푸는 코드는 다음과 같다.

1
2
3
4
5
6
def solution(n):
    dp = [1] + [0] * n
    dp[0], dp[1] = 1, 1
    for i in range(2, n+1):
        dp[i] = (dp[i-1] + dp[i-2]) % 1234567
    return dp[n]