※주의※
저의 풀이가 정답은 아닙니다.
다른 코드가 더 효율적이거나 좋을 수 있습니다.
언제나 다른 사람의 코드는 참고만 하시기 바랍니다.
[문제 풀이 사이트]
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
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);
}
'PS > Programmers' 카테고리의 다른 글
[Programmers Level2] 전력망을 둘로 나누기(C++) (0) | 2022.08.22 |
---|---|
[Programmers Level3] 여행경로(C++) (0) | 2022.08.16 |
[Programmers Level3] 가장 먼 노드(C++) (0) | 2022.08.15 |
[Programmers Level3] 네트워크(C++) (0) | 2022.08.13 |
[Programmers Level2] 3xn타일링(C++) (0) | 2022.08.13 |
댓글