끄적끄적 코딩
article thumbnail

 

 

정수 n이 주어졌을 때, 1,2,3의 합으로 나타내는 방법의 수를 구하는 문제입니다.

 

여러번의 반복 작업이 있을때 유용하게 만들었다. 다이나믹 프로그래밍 기법으로 메모이제이션을 사용했습니다.

 

이 문제의 규칙은

1을 만드는 방법은 1가지

2를 만드는 방법은 2가지

3을 만드는 방법은 4가지

 

4를 만드는 방법은 1 + 2 + 4 = 7가지

5를 만드는 방법은 2 + 4 + 7 = 13가지

 

규칙은 현재 찾는 값이 5라면

2를 만드는 방법  =  2가지

3를 만드는 방법  =  4가지

4를 만드는 방법  =  7가지

2 + 4 + 7 = 13

5를 만드는 방법 = 13이 된다.

 

그렇기 때문에 x라는 값을 구하게 될때

x-1, x-2, x-3의 값이 있다면 편리하게 구할 수 있습니다.

 

전역변수로 memo[]에 코드가 실행되면서 찾은 값들이 입력이 됩니다..

그리고 새로 찾는 숫자가 memo[]에 있는 숫자라면 여러 연산없이 풀 수 있습니다.

 

#include <iostream>
using namespace std;

int memo[100] = {0,};
int memonum = 3;

int main(int argc, char *argv[])
{
	int cycle = 0;
	int num;
	int tmp;
	int x[3] = { 1, 2, 4 };
	memo[0] = 0;
	memo[1] = 1;
	memo[2] = 2;
	memo[3] = 4;
	
	cin >> cycle;

	for (int i = 0; i < cycle; ++i) {
		cin >> num;
		if (num > memonum) {
			x[0] = memo[memonum - 2];
			x[1] = memo[memonum - 1];
			x[2] = memo[memonum];
		}
		else {
			cout << memo[num] << endl;
			continue;
		}
		while (num > memonum) {
			++memonum;
			memo[memonum] = x[0] + x[1] + x[2];
			x[0] = memo[memonum - 2];
			x[1] = memo[memonum - 1];
			x[2] = memo[memonum];
		}
		cout << memo[memonum] << endl;
	}
	return 0;
}

'알고리즘' 카테고리의 다른 글

[C++] 백준 1001번 A-B  (0) 2019.03.04
[C++] 백준 1000번 A+B  (0) 2019.03.04
[C++] 백준 2557번 Hello World  (0) 2019.03.04
[C++] 백준 2839번 설탕 배달  (0) 2019.02.05
[C++] 백준 11047번 동전 0  (0) 2019.01.29

검색 태그