1,2,3 더하기
문제설명
테스트 케이스 수를 입력 받고, 구하고자 하는 수를 입력 받은 뒤 그 정수를 1,2,3의 합으로 나타내는 총 방법의 수를 출력하라.
그리고 그 동작을 테스트 케이스 수만큼 반복한다.
알고리즘
- 테스트케이스와 구하고자 하는 수를 입력 받는다.
- 초기값을 저장한다.
- 연산에 필요한 만큼 반복문을 통해서 미리 계산한다.
- 값을 조회하여 알맞은 부분을 출력시킨다.
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
int main(void)
{
int T;
cin >> T;//테스트 케이스 수 입력
while (T)
{
int N;//계산하고자 하는 수 입력
int dp[12];
cin >> N;
//초기값
dp[0] = 1;
dp[1] = 2;
dp[2] = 4;
for (int i = 3; i < 12; i++)//연산
dp[i] = dp[i - 3] + dp[i - 2] + dp[i - 1];
cout << dp[N - 1] << "\n";//출력
T--;
}
return 0;
}
과정
위의 문제는 다이나믹 프로그래밍 문제이기 때문에 bottom-up 또는 top-down
방식을 사용해서 풀어야한다.
이번 문제에서는 bottom-up: 아래부터 차례로 확인하는 방식
으로 구할 수 있었다.
각 정수별로 직접 몇 가지 인지 세어보고 규칙을 찾아서 풀 수 있었다.
시간 감소를 위해서 연산이 된 것들은 배열안에 저장하고 다시 사용하는 방식이다.
규칙을 구해보니 dp[i] = dp[i - 3] + dp[i - 2] + dp[i - 1]
와 같이 전의 3가지 값을 더하면 다음 값이 나오는 것을 확인할 수 있다.
고찰
단순한 dp문제여서 해결할 수 있었던 것 같다. 다른 유형들도 좀 더 풀어서 개념을 잡을 필요가 있을 것 같다.
'Algorithm' 카테고리의 다른 글
[백준 1541] 잃어버린 괄호 (0) | 2021.07.29 |
---|---|
[백준 1181] 단어 정렬 (0) | 2021.07.29 |
[백준 1764] 듣보잡 (0) | 2021.07.29 |
[백준 1074] Z (0) | 2021.07.29 |
[백준 1620] 나는야 포켓몬 마스터 이다솜 (0) | 2021.07.28 |