[BOJ 9095] 1, 2, 3 더하기

이진중·2022년 5월 14일
0

알고리즘

목록 보기
11/76

문제해석

1, 2, 3을 활용해서 11이하의 자연수 N을 순서있이 만들어 내는 방법의 수를 구하면된다.
4 = 1+1+2 와 4= 1+2+1은 다른 경우로 계산한다

완전탐색

1와2와3의 개수만 파악한다면, 확률과 통계에서 배운 서로다른 3개의 색상의 의자를 배열하는것과 같이 (i+j+k)! / i! j! k! = 경우의 수이므로 쉽게 구할수 있다.

반복문을 3번 반복해서 사용했다. 팩토리얼같은경우는 반복계산이 들어가지 않도록 배열에 미리만들어놓고 계산했다. 숫자가 작아서 시간초과는 나지 않았다.

	int facto[20];
	for (int i = 0; i < 20; i++)
	{
		facto[i] = 1;
	}

	for (int i = 0; i < 19; i++)
	{
		facto[i + 1] = facto[i] * (i+1);
	}


	for (int t = 0; t < N; t++)
	{
		cin >> numList[t];
		int answer = 0;
		for (int i = 0; i <= 10; i++)
		{
			for (int j = 0; j <= 5; j++)
			{
				for (int k = 0; k <= 3; k++)
				{
					if (i * 1 + j * 2 + k * 3 == numList[t]) {
						int tmp = facto[i + j + k];
						tmp /= facto[i];
						tmp /= facto[j];
						tmp /= facto[k];
						answer += tmp;
					}
				}
			}
		}
		cout << answer << endl;
	}

0개의 댓글