2019년 4월 13일 토요일

# 멀리뛰기 문제 풀이 알고리즘

이동할 지역이 1개, 2개, 3개....등으로 몇개 case를 만들어서 보면 패턴이 보인다. -> 바로 피보나치 수열과 동일한 패턴이 등장한다. 피보나치 수열을 구하는데 있어 매우 큰 숫자에 대해서는 속도가 느려지므로, Dynamic Programming 에서 자주쓰이는 메모리기법을 이용한다.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/*
효진이는 멀리 뛰기를 연습하고 있습니다. 
효진이는 한번에 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하면 됩니다.
*/
using namespace std;
#define EMPTY 0
#define MOD 1234567
long long memo[2000];
long long GetJumpways(int n);
long long solution(int n) {
    return GetJumpways(n);
}

long long GetJumpways(int n){
    if(n <= 1) return 1;
    if(memo[n] != EMPTY){
        return memo[n];
    }
    else{
         memo[n] = (GetJumpways(n-1) % MOD + GetJumpways(n-2) % MOD) % MOD;
    }
    return memo[n];
}

댓글 없음:

댓글 쓰기