[프로그래머스 / Lv 2] 멀리 뛰기 by JS
📄 문제
효진이는 멀리 뛰기를 연습하고 있습니다. 효진이는 한번에 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 이하인 정수입니다.
🙋♀️ 나의 풀이
function solution(n) {
if (n === 1 || n === 2) return n;
const dp = Array(n).fill(0);
dp[0] = 1;
dp[1] = 2;
for (let i = 2; i < n; i++) {
dp[i] = (dp[i - 1] + dp[i - 2]) % 1234567;
}
return dp[n - 1];
}
처음 문제를 보고 DFS로 접근했더니 시간 초과가 되어 동적 계산법(DP)로 다시 생각했습니다.
n이 1일 경우 -> 1
n이 2일 경우 -> 2
n이 3일 경우 -> 3
n이 4일 경우 -> 5
n이 5일 경우 -> 8
n이 6일 경우 -> 13
문제의 답이 피보나치 수열로 이루어져 있습니다.
따라서 배열 (dp
)의 맨 앞과 두번째 수를 1과 2로 만들고 그 뒤의 값들을 구하면 답을 알 수 있습니다.
% 1234567
연산을 for문 안에서 한 이유는 dp[n - 1]의 크기가 커져 오버 플로우가 발생하기 때문입니다.
👍 Best Practice
function jumpCase(num) {
if (num <= 2) return num;
return jumpCase(num - 1) + jumpCase(num - 2);
}
같은 방식을 재귀함수로 풀어낸 풀이입니다.
문제 출처
- 프로그래머스
Leave a comment