멀리 뛰기
문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/12914
접근 방식
dfs가 바로 생각나서 풀어봤는데, 역시나 시간초과가 발생했다.
그래서 메모리를 통한 방식을 생각해보게 되었는데, 특정 패턴이 발견되었다.
1칸을 뛸 수 있는 방식은 [1] 한 가지다.
2칸을 뛸 수 있는 방식은 [1, 1] [2] 두 가지다.
3칸을 뛸 수 있는 방식은 [1, 1, 1] [2, 1] [1, 2] 세 가지다.
4칸을 뛸 수 있는 방식은 [1, 1, 1, 1] [2, 1, 1] [1, 2, 1] [2, 1, 1] [2, 2] 네 가지다.
여기서 뭔가 패턴이 보이는 것 같다. 이어서 더 알아보자.
5칸은 [1, 1, 1, 1, 1] [1, 2, 2] [2, 1, 2] [2, 2, 1] [2, 1, 1, 1] [1, 2, 1, 1] [1, 1, 2, 1] [1, 1, 1, 2] 8가지다.
현재 방식에서 뛸 수 있는 방식은 전과 전전 방식의 합과 같다.
이는 mod 연산에도 동일하게 적용된다. 따라서, 1과 2를 사전에 연산을 해 두고, n만큼 for문을 돌린다면 쉽게 정답을 알 수 있다.
결과
소스 코드
class Solution {
static long answer = 0;
public long solution(int n) {
int arr[] = new int[2001];
arr[1] = 1 % 1234567;
arr[2] = 2 % 1234567;
for(int i=3; i<=n; i++){
arr[i] = (arr[i-1] + arr[i-2])%1234567;
}
return arr[n];
}
}
다른 접근 방식
없음.
알게 된 점
없음.