문제
https://www.acmicpc.net/problem/9095
걸린 시간
01 : 41 : 02
풀이
Python3
def ways(n, s, v):
count = 0
s += v
if s == n:
return 1
elif s > n:
return 0
else:
count += ways(n, s, 1) + ways(n, s, 2) + ways(n, s, 3)
return count
if __name__ == "__main__":
T = int(input())
result = []
for _ in range(0, T):
n = int(input())
result.append(ways(n, 0, 0))
for i in result:
print(i)
이렇게 오래 걸릴 문제가 아니엇다.
순환을 이용하면 간단히 해결될 것을 DFS 문제로 보고 한참 동안 삽질을 했다.
다른 풀이
C++
#include <stdio.h>
#include <iostream>
#include <string.h> // memset
using namespace std;
int N;
int cache[10]; // 인덱스 : 누적값, 값 : 방법의 수
int solve(int n){
// 기저 사례
if(n == N)
return 1;
if(n > N)
return 0;
// 메모이제이션
int &ret = cache[n];
if(ret != -1)
return ret;
// 재귀 호출
return ret = solve(n+1) + solve(n+2) + solve(n+3);
}
int main(){
int tc;
scanf("%d", &tc);
while(tc--){
scanf("%d", &N);
memset(cache, -1, sizeof(cache));
printf("%d\n", solve(0));
}
return 0;
}
메모이제이션을 적용한 동적 계획법 풀이이다.
'Baekjoon' 카테고리의 다른 글
Baekjoon 11726번 2xn 타일링 (0) | 2020.08.09 |
---|---|
Baekjoon 1463번 1로 만들기 (0) | 2020.08.09 |
Baekjoon 1697번 숨바꼭질 (0) | 2020.08.08 |
Baekjoon 1931번 회의실배정 (0) | 2020.08.07 |
Baekjoon 2606번 바이러스 (0) | 2020.08.06 |
댓글