본문 바로가기
Programming/PS

[BOJ] C/C++ 9095 "1,2,3 더하기"

by yoiii 2020. 12. 24.

[BOJ] C/C++ 9095 "1,2,3 더하기" 문제풀이

난이도 : SILVER3


문제

정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 7가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다.

  • 1+1+1+1
  • 1+1+2
  • 1+2+1
  • 2+1+1
  • 2+2
  • 1+3
  • 3+1

정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오.


입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다. n은 양수이며 11보다 작다.


출력

각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다.


풀이

@ DP(다이나믹 프로그래밍)을 이용한 풀이 / 시간복잡도 O(N)

 

문제 조건에서, 1,2,3 만을 이용하여 합으로 나타내라고 제시하였다.

따라서 입력받은 (10이하의)정수 N을 1,2,3 만으로 나타내는 방법

 

[N-1] 까지의 조합 + 1

[N-2] 까지의 조합 + 2

[N-3] 까지의 조합 + 3

이렇게 총 3가지이다.

 

4를 예시로 들어보면,

 

3까지의 조합 + 1 <4가지>

1 + 1 + 1 +1

1 + 2 +1

2 + 1 +1

3 +1

 

2까지의 조합 + 1 <2가지>

1 + 1 + 1

2 + 1

 

1까지의 조합 + 1 <1가지>

1 + 1

 

따라서, 4까지의 조합 = [3까지의 조합 + 1] 4가지 + [2까지의 조합 + 1] 2가지 + [1까지의 조합 + 1] 1가지 = 7가지 이다.

 

이를 점화식으로 표현하면, dp[n] = dp[n-3] + dp[n-2] + dp[n-1] 이다.

 


소스코드

#include <iostream>
using namespace std;

int main() {
	int dp[11];
	int testCase;
	int n;
	cin >> testCase;

	//init
	dp[0] = 0;
	dp[1] = 1;
	dp[2] = 2;
	dp[3] = 4;

	for (int i = 4;i <= 10;i++) {
		dp[i] = (dp[i - 1] + dp[i - 2] + dp[i - 3]);
	}

	for (int k = 1;k <= testCase;k++) {
		cin >> n;
		cout << dp[n] << endl;
	}

	return 0;
}

www.acmicpc.net/problem/9095

 

9095번: 1, 2, 3 더하기

각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다.

www.acmicpc.net

'Programming > PS' 카테고리의 다른 글

[BOJ] C/C++ 11727 "2xn 타일링 2"  (0) 2020.12.25
[BOJ] C/C++ 2446 "별찍기-9"  (0) 2020.12.25
[BOJ] C/C++ 11726 "2xn 타일링"  (0) 2020.12.24
[BOJ] C/C++ 2522 별찍기 - 12  (0) 2020.12.24
[BOJ] C/C++ 2445 별찍기 - 8  (0) 2020.12.23

댓글