[프로그래머스] 멀리 뛰기 - 파이썬

Donghyun·2024년 8월 12일
0

Code Kata - 파이썬

목록 보기
39/54
post-thumbnail

링크: https://school.programmers.co.kr/learn/courses/30/lessons/12914

문제 설명

효진이는 멀리 뛰기를 연습하고 있습니다. 효진이는 한번에 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가지 방법으로 멀리 뛸 수 있습니다.


문제풀이

문제 이해하기:

목표: n 이 주어질 때 n 까지 도달하는 방법에 1234567 을 나눈 나머지를 return

내 풀이:
혹시 규칙성이 있을까 해서 n 이 1일 때부터 몇 가지 방법이 있는지 파악해봤다.

n = 1 일 때 → 1 가지:

  • 1

n = 2 일 때 → 2 가지

  • 1, 1
  • 2

n = 3 일 때 → 3 가지

  • 1, 1, 1
  • 1, 2
  • 2, 1

n = 4 일 때 → 5 가지

  • 1, 1, 1, 1
  • 1, 2, 1
  • 1, 1, 2
  • 2, 1, 1,
  • 2, 2

n = 5 일 때 → 8 가지

  • 1, 1, 1, 1, 1
  • 1, 2, 1, 1
  • 1, 1, 2, 1
  • 1, 1, 1, 2
  • 1, 2, 2
  • 2, 1, 1, 1
  • 2, 2, 1
  • 2, 1, 2

여기까지 구해봤을 때 ‘어라..? 어디서 많이 보던 규칙인데? 1, 2, 3, 5, 8.. 이전 두 개의 항을 더해 다음 항이 되는… 피보나치 수열?’ 그래서 마지막으로 n 이 6일때도 구해봤다.

n = 6 일 때 → 13 가지

  • 1, 1, 1, 1, 1, 1
  • 1, 2, 1, 1, 1
  • 1, 1, 2, 1, 1
  • 1, 1, 1, 2, 1
  • 1, 1, 1, 1, 2
  • 1, 2, 2, 1
  • 1, 2, 1, 2
  • 1, 1, 2, 2
  • 2, 1, 1, 1, 1
  • 2, 2, 1, 1
  • 2, 1, 2, 1
  • 2, 1, 1, 2
  • 2, 2, 2

지금까지 구해본 결과를 봤을 때 모두 F(n+1) 항의 값이 나왔다. 그러면 피보나치 수를 구하는 코드를 구현하고, n 을 n+1 로 업데이트 해서 문제를 풀면 되지 않을까?

최종코드

def solution(n):
    memo = {}
    n = n+1
    
    fibo = {0: 0, 1: 1}
    
    for i in range(2, n+1):
        fibo[i] = fibo[i-1] + fibo[i-2]
    
    return fibo[n] % 1234567
  • 결과: 제출결과 모든 테스트에 대해서 통과를 했지만, 제출의도가 이게 맞는지는 모르겠다..

다른 사람들의 풀이 결과를 찾아보면 피보나치 수열의 규칙성을 파악해 푸는 방법이 맞고, 잘 한 거 같다.

  • 그러고 보면 이전 항에서 쓰였던 패턴 + 마지막에 1 추가 되는 방식이 반복해서 쓰이긴 한다.
profile
데이터분석 공부 일기~!

0개의 댓글