[Python] 프로그래머스 - 멀리 뛰기 (연습문제/Level 3)

yunyoung·2021년 3월 5일
0

알고리즘

목록 보기
31/41

문제 설명

📃 문제 링크

효진이는 멀리 뛰기를 연습하고 있습니다. 효진이는 한번에 1칸, 또는 2칸을 뛸 수 있습니다. 칸이 총 4개 있을 때, 효진이는
(1칸, 1칸, 1칸, 1칸)
(1칸, 2칸, 1칸)
(1칸, 1칸, 2칸)
(2칸, 1칸, 1칸)
(2칸, 2칸)
의 5가지 방법으로 맨 끝 칸에 도달할 수 있습니다. 멀리뛰기에 사용될 칸의 수 n이 주어질 때, 효진이가 끝에 도달하는 방법이 몇 가지인지 알아내, 여기에 1234567를 나눈 나머지를 리턴하는 함수, solution을 완성하세요. 예를 들어 4가 입력된다면, 5를 return하면 됩니다.

제한 사항

  • n은 1 이상, 2000 이하인 정수입니다.

입출력 예

nresult
45
33

입출력 예 설명

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

입출력 예 #2
(2칸, 1칸)
(1칸, 2칸)
(1칸, 1칸, 1칸)
총 3가지 방법으로 멀리 뛸 수 있습니다.

🎈 문제 풀이

거스름돈 문제와 거의 비슷했다. [1,2]원으로 n원을 낼 수 있는 경우의 수를 찾는 것과 동일했다. 차이점은, 거스름돈 문제의 경우 동전의 순서가 상관없지만, 이 문제는 요소가 같아도 순서가 다르면 다른 경우로 친다는 것이다. 즉, 문제에서 주어진 것처럼 [1,2,1] != [1,1,2]이다.

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

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

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

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]

📝 소스 코드

다른 풀이

def solution(n):
    a, b = 1, 2
    if n == 1:
        return 1
    for i in range(2,n):
        a, b = b, a+b
    return b % 1234567
profile
🌈TIL과 개발 노트

0개의 댓글