-
멀리 뛰기python algorithm 2024. 2. 23. 12:19
효진이는 멀리 뛰기를 연습하고 있습니다. 효진이는 한번에 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하면 됩니다.
[제한 사항]
1 <= n <= 2000
[풀이]
def solution(n): answer = 0 # 1 2 3 4 5 6 7 8 # 1 2 3 5 8 13 21 34 tmp = [] for i in range(n+1): if i <= 2: tmp.append(i) else: tmp.append(tmp[i-2] + tmp[i-1]) answer = tmp[n] % 1234567 return answer
[해설]
어떻게 접근해야할지 몰라, 혹시나 규칙성이 있지 않을까 경우를 찾아보았고, 피보나치 수열과 같은 구조를 갖고 있다고 생각했다. 피보나치 수열을 푸는 점화식을 만들어 해결했다.
여기서 주의해야할 것은 answer에는 꼭 tmp[n] % 1234567을 해야한다는 것이다. 만약 경우의 수가 1234567보다 크다면 answer는 달라질 수 밖에 없다. 이 조건을 늦게 다시 깨닫게 되어서 풀이에 조금 오래 걸렸다.
하지만 제한사항을 고려할 때, n이 2000일 경우 tmp에 2000개의 숫자가 쌓인다는 점에서 비효율적이라고 생각했고, 해결방법을 찾던 중 아래의 좋은 코드를 발견했다.
[더 좋은 코드]
def solution(n): if n == 1: return 1 % 1234567 elif n == 2: return 2 % 1234567 else: a,b = 1,2 for i in range(n-2): a, b = b, a+b return b % 1234567
리스트를 만드는 방식이 아닌 python의 변수 특징을 고려한 방식으로, 두 개의 변수의 값을 계속 교체하는 방식을 사용하면 훨씬 더 좋겠다는 생각이 들었다.
'python algorithm' 카테고리의 다른 글
최대공약수와 최소공배수 (0) 2024.02.25 카펫 (0) 2024.02.23 숫자의 표현 (0) 2024.02.22 짝지어 제거하기 (0) 2024.02.19 이진 변환 반복하기 (0) 2024.02.18