나만의 작은 도서관
문제 12914. 멀리 뛰기 본문
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/12914
난이도 : 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 |