나만의 작은 도서관

문제 12914. 멀리 뛰기 본문

프로그래머스 문제풀이/코드카타

문제 12914. 멀리 뛰기

pledge24 2024. 7. 5. 09:25

문제 링크

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

 

프로그래머스

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

programmers.co.kr

 

 

난이도 : Lv.2  

 

문제 요약 설명

효진이는 멀리 뛰기를 연습하고 있습니다. 효진이는 한번에 1칸, 또는 2칸을 뛸 수 있습니다. 칸이 총 4개 있을 때, 효진이는
(1칸, 1칸, 1칸, 1칸)
(1칸, 2칸, 1칸)
(1칸, 1칸, 2칸)
(2칸, 1칸, 1칸)
(2칸, 2칸)
의 5가지 방법으로 맨 끝 칸에 도달할 수 있습니다. 멀리뛰기에 사용될 칸의 수 n이 주어질 때, 효진이가 끝에 도달하는 방법이 몇 가지인지 알아내, 여기에 1234567를 나눈 나머지를 리턴하는 함수, solution을 완성하세요. 

입력

  • 멀리뛰기에 사용될 칸의 수 n

입력 제한

  • n은 1 이상, 2000 이하인 정수입니다.

입력 예제

// input
4

// ans
5

 

풀이 방식

다이나믹 프로그래밍(DP)를 사용하면 쉽게 풀린다. 아래 코드는 타뷸레이션 방식으로 진행되었고, 효진이는 1칸 또는 2칸만 뛸 수 있기 때문에 N번째 칸의 경우의 수는 N-1과 N-2번째 칸의 경우의 수의 합이다. 따라서, 점화식은 다음과 같다.

 

N = N-1 + N-2 (N >= 3)

 

N이 3이상일 경우에만 성립되는 점화식이기 때문에, N이 1 또는 2일때 경우의 수를 구해준 다음, 이후에는 위의 점화식을 사용해서 구하면 된다.

 

매 반복마다 나머지 연산을 해도 되는 이유

나머지 연산 즉, 모듈러 산술 연산은 아래와 같이 분배 법칙을 성질로 가지고 있기 때문에 매 반복마다 사용해도 결과값이 동일하다.

 

정답 코드 

더보기
#include <string>
#include <vector>

#define DIV 1234567

using namespace std;

long long solution(int n) {
    long long answer = 0;
    vector<long long> dp(n+1);
    dp[1] = 1, dp[2] = 2;
    
    for(int i = 3; i <= n; i++){
        dp[i] = (dp[i-1] + dp[i-2])%DIV;
    }
     
    answer = dp[n];
    return answer;
}

 

'프로그래머스 문제풀이 > 코드카타' 카테고리의 다른 글

문제 76502. 괄호 회전하기  (0) 2024.07.07
문제 138476. 귤 고르기  (0) 2024.07.06
문제 12953. N개의 최소공배수  (0) 2024.07.04
문제 12985. 예상 대진표  (1) 2024.07.03
문제 42842. 카펫  (0) 2024.07.02