[Java] 12914 멀리 뛰기
📝 멀리 뛰기
1. 문제 요약
이 문제는 사실상 피보나치 수열이랑 똑같다 🙂
- n = 1 → 1가지 방법 (1칸)
- n = 2 → 2가지 방법 (1칸+1칸, 2칸)
- n = 3 → 3가지 방법
- n = 4 → 5가지 방법
점화식
이걸 매번 1234567로 나눈 나머지 저장하기
2. 정답코드
class Solution {
public long solution(int n) {
// n칸까지 방법 수 담을 배열
long[] dp = new long[n + 1];
dp[0] = 1; // 0칸일 때도 1가지 방법(아무것도 안함)
dp[1] = 1; // 1칸일 때도 1가지 방법
for (int i = 2; i <= n; i++) {
dp[i] = (dp[i - 1] + dp[i - 2]) % 1234567;
}
return dp[n];
}
}
공간최적화 - 배열 안쓰고 2칸만 기억
class Solution {
public long solution(int n) {
long a = 1, b = 1; // dp[0], dp[1]
for (int i = 2; i <= n; i++) {
long temp = (a + b) % 1234567;
a = b;
b = temp;
}
return b;
}
}
3. 오답 / 어려웠던 점
배열 칸 수 지정하는 부분이 헷갈렸다. 0부터 시작하는데 <= n까지인 이유
- 칸 수 n 까지의 방법을 저장하려면 dp[n]까지 접근해야 한다.
- 만약 배열 크기를 n으로 만들면 마지막 인덱스는 n-1 까지 밖에 안 된다.
- 그래서 dp = new long[n + 1]로 만들면 dp[0] ~ dp[n]까지 접근 가능해져서 dp[n]을 바로 쓸 수 있다.
- 예를 들어 n = 4 일 때
dp[0] = 1
dp[1] = 1
dp[2] = ?
dp[3] = ?
dp[4] = ?
- n=4칸일 때, 칸을 0부터 4까지 있다고 생각한다.
- 0칸 → 이미 출발점에 있음 → 방법 1가지
- 1칸 → 1칸 뛰어서 도착 → 방법 1가지
- 그럼 2칸, 3칸, 4칸 방법 수를 계산해야 된다.
이런 식으로 마지막 dp[4]까지 저장하려면 배열 길이가 5(n+1)이어야 함
dp[i]
= i칸까지 도달하는 방법 수
- 0칸:
dp[0] = 1
- 1칸:
dp[1] = 1
- 2칸:
dp[2] = dp[1] + dp[0] = 1 + 1 = 2
- 3칸:
dp[3] = dp[2] + dp[1] = 2 + 1 = 3
- 4칸:
dp[4] = dp[3] + dp[2] = 3 + 2 = 5