PS/Programmers

[Programmers Level2] 멀리 뛰기(C++)

박땅콩 2022. 8. 15.
728x90

※주의※

저의 풀이가 정답은 아닙니다.

다른 코드가 더 효율적이거나 좋을 수 있습니다.

언제나 다른 사람의 코드는 참고만 하시기 바랍니다.

 

 

[문제 풀이 사이트]

 

 

 

프로그래머스

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

programmers.co.kr

 

 

[문제 설명]

 

 

효진이는 멀리 뛰기를 연습하고 있습니다. 효진이는 한번에 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 이하인 정수입니다.

 

 

[입출력 예]

 

 

n result
4 5
3 3

 

 

[입출력 예 설명]

 

 

입출력 예#1

위에서 설명한 내용과 같습니다.

 

 

입출력예#2

(2칸, 1칸)

(1칸, 2칸)

(1칸, 1칸, 1칸)

총 3가지 방법으로 멀리 뛸 수 있습니다.

 

 

[문제 풀이]

 

문제를 읽고 아 이건 DP 문제다!!! 라고 느꼈다.

그리고 문제를 보고 딱 떠오른 문제가 있는데 바로 백준의 1, 2, 3 더하기 였다.

 

[BaekJoon 9095번] 1, 2, 3 더하기(C++)

※주의※ 저의 풀이가 정답은 아닙니다. 다른 코드가 더 효율적이거나 좋을 수 있습니다. 언제나 다른 사람의 코드는 참고만 하시기 바랍니다. [문제 풀이 사이트] 9095번: 1, 2, 3 더하기 각 테스

park-peanut.tistory.com

 

 

우선 DP 문제이기 때문에

 

1. 테이블을 정의한다.

dp[n] = n칸을 멀리 뛰기를 했을 때 끝에 도달하는 방법의 수

 

2. 점화식을 정의한다.

 

✓ n = 1일 때

(1칸)

 

✓ n = 2일 때

(1칸, 1칸)

(2칸)

 

✓ n = 3일 때

(1칸, 1칸, 1칸)

(2칸, 1칸)

(1칸, 2칸)

 

✓ n = 4일 때

(1칸, 1칸, 1칸, 1칸)

(2칸, 1칸, 1칸)

(1칸, 2칸, 1칸)

(1칸, 1칸, 2칸)

(2칸, 2칸)

 

위 내용을 바탕으로 규칙을 살펴보자면

n = 3 일 때

(1칸, 1칸, 1칸)

(2칸, 1칸)

n = 2 일 때의 방법에 + 1칸을 붙임

 

(1칸, 2칸)

n = 1 일 때의 방법에 + 2칸을 붙임

 

 

n = 4일 때

(1칸, 1칸, 1칸, 1칸)

(2칸, 1칸, 1칸)

(1칸, 2칸, 1칸)

n = 3 일 때의 방법에 + 1칸을 붙임

 

(1칸, 1칸, 2칸)

(2칸, 2칸)

n = 2 일 때의 방법에 + 2칸을 붙임

 

위 내용을 바탕으로 아래와 같은 점화식을 세울 수 있다.

dp[n] = dp[n-1] + dp[n-2]

 

 

3. 초기값을 정의한다.

 

초기값은 dp[1] = 1과 dp[2] = 2로 초기값을 정할 수 있다.

 

 

[최종 코드]

 

 

[GitHub]

 

 

 

GitHub - SmallPeanutPark/Programmers: Study Programmers for Coding Test

Study Programmers for Coding Test. Contribute to SmallPeanutPark/Programmers development by creating an account on GitHub.

github.com

 

 

#include <string>
#include <vector>

using namespace std;
#define MODULAR 1234567

long long dp[2001];

long long recursive(int n) {
    if(dp[n] != 0) return dp[n] % MODULAR;
    else {
        return dp[n] = (recursive(n - 2) + recursive(n -1)) % MODULAR;
    }
}

long long solution(int n) {
    fill(dp, dp + 2001, 0);
    dp[1] = 1;
    dp[2] = 2;
    return recursive(n);
}

 

 

728x90

댓글