한 걸음씩

[프로그래머스][JS] 멀리 뛰기 ✅ 본문

Programmers

[프로그래머스][JS] 멀리 뛰기 ✅

winter17 2023. 9. 6. 12:30

https://school.programmers.co.kr/learn/courses/30/lessons/12914

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이 과정

function solution(n) {
    // n = 4
    const MOD = 1234567
    const dp = new Array(n + 1).fill(0)
    // console.log(dp) // [ 0, 0, 0, 0, 0 ]
    
    // 초기값을 설정하여 초기값을 바탕으로 n까지 순차적으로 값을 계산
    dp[1] = 1
    dp[2] = 2
    
    for (let i = 3; i <= n; i++){
        dp[i] = (dp[i - 1] + dp[i - 2]) % MOD
    }
    // console.log(dp) // [ 0, 1, 2, 3, 5 ]
    return dp[n];
}

동적 계획법(DP)은 문제를 작은 부분 문제로 나누고, 나눈 부분 문제들을 해결하여 큰 문제를 해결하는 알고리즘 설계 기법이다.

중복 계산을 피하기 위해 이전에 계산한 결과를 저장하고 재사용하는 방식으로 동작한다. 

위 코드에서 dp 배열을 생성할 때 n + 1인 이유는 dp [0]은 사용하지 않기 때문이다. 

dp [i]는 i칸을 뛰어서 도달할 수 있는 방법의 수를 나타내므로 배열의 인덱스와 칸 수를 일치시켜야 한다. 

이후에 dp[1]와 dp [2]의 초기값을 설정해야 한다. 피보나치수열을 구하는 방법을 생각해 보면 이전 값을 가지고 이후의 값을 계산한다.

이러한 재귀적 접근을 사용해야 문제를 풀 수 있다. 

반복문 또한 피보나치 수열을 구하는 방법과 유사한 방식을 적용하고 있다. 다만, DP의 핵심 원리 중 하나인 중복 계산을 피하기 위해 값을 저장하고 재사용하며, 이를 통해 효율적으로 문제를 해결한다.


리뷰

다이나믹 프로그래밍 문제는 처음 접근해 보는데 피보나치수열 문제 푸는 것과 유사했지만 스스로 풀어내기에는 어려웠다.