- 문제 : https://www.acmicpc.net/problem/1003


1. 생각해보기
그래프를 그려보면, N = (N-1) + (N-2)를 더한 경우의 수라는 것을 알 수 있다.
여기에서 0,1의 케이스에 대해서 각각 구해야 하는데 이는 DP 테이블에 넣어줄거다. (2차원 배열로[i][0]에는 0의 개수, [i][1]에는 1의 개수)
초기값은 0,1에 대해서 세팅이 필요하다
DP[0][0] = 1
DP[0][1] = 0
DP[1][0] = 0
DP[1][1] = 1
// max값 가져와서 max까지 DP 테이블 채우기
for(let i=2; i<= max; i++){
DP[i][0] = DP[i-1][0] + DP[i-2][0];
DP[i][1] = DP[i-1][1] + DP[i-2][1];
}
// 출력
for(...)
[시간복잡도]
N의 최대값은 40개라고 했으니까. 최대 40까지 DP 테이블을 채우게 되고,
출력은 입력개수 만큼 for문이 돌게 된다.
시간은 0.25초임으로, 1억(10^8) * 0.25 = 25 * 10^6 계산 가능함으로 충분히 계산가능하다.
2. 결과

첫번째 시도에서 런타임 에러가 발생했습니다.
이유는 DP테이블에 초기값을 세팅해주는데 max값이 0이 오는 경우, DP[1][0]과 DP[1][1]에는 접근 할 수 없기 때문이었습니다.
해당 부분에 if문을 걸어주는 방향으로 코드 수정을 하였더니 개선되었습니다
https://github.com/moonlight-duck/study-algorithms/pull/27
[민주] DP (+ Greedy) 문제 by min-99 · Pull Request #27 · moonlight-duck/study-algorithms
📌 문제 정보 문제 링크 : https://www.acmicpc.net/problem/2839 카테고리 (예: 구현, 탐색, DP) : DP + Greedy ✏️ 풀이 방법 결과 (성공/실패) : 성공 풀이 시간 : 1h30m 풀이 방법 : https://min-99.tistory.com/36 참고한
github.com
'알고리즘' 카테고리의 다른 글
| 최장 공통 부분 수열 (Longest Common Subsequence, LCS) (0) | 2025.11.17 |
|---|---|
| 2×n 타일링 (DP) (0) | 2025.11.17 |
| Adding 1s, 2s, and 3s (DP, + 해석) (0) | 2025.11.17 |
| Greedy(탐욕 알고리즘) (0) | 2025.11.15 |
| DP 문제(백준 1463 번) (0) | 2025.11.15 |