https://school.programmers.co.kr/learn/courses/30/lessons/12914
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
코드
class Solution {
public long solution(int n) {
/*
가장 최소의 경우
2로 나누어 떨어짐 O : 모든 칸을 2로 뛴다.
2로 나누어 떨이짐 X : 한칸 뺴고 2로 뛴다.
*/
/*
2222
22112
22121
22211
221111
2111111
211112
211121
211211
21122
212111
211111111
21111112
21111121
21211211
*/
/*
질문하기를 통해 보니 '피보나치 수열'이었다..
*/
long[] dp = new long[n+2];
dp[0]=0L;
dp[1]=1L;
for(int i=2; i<n+2; i++){
dp[i]=(dp[i-2]+dp[i-1])%1234567;
}
return dp[n+1];
}
}
바로 피보나치가 떠오르진 않았다.
규칙성을 찾기위해 경우의 수를 늘어놓았지만 보이지 않았다.
질문하기를 통해 피보나치 수열임을 알게 되었다.
아래 그림과 같이 피보나치에서 경우의 수에 대한 증명도 있었다.
그리고 오버플로우 문제도 발생했는데 DP 배열에 저장할 때 1234567로 처리한 값을 저장하도록 하여 해결했다.
문제를 많이 풀어봐야겠다.
시간은 20분 정도 소요되었다.
'알고리즘 > 문제' 카테고리의 다른 글
*[프로그래머스] Lv2 2018 KAKAO BLIND RECRUITMENT[1차] 캐시 / JAVA (0) | 2023.03.09 |
---|---|
[프로그래머스] Lv2 괄호 회전하기 / JAVA (0) | 2023.03.08 |
[프로그래머스] Lv2 점프와 순간이동 / JAVA (0) | 2023.03.04 |
[프로그래머스] Lv2 예상대진표 / JAVA (0) | 2023.03.01 |
<실패>[프로그래머스] Lv2 구명보트 / JAVA (0) | 2023.02.28 |