발자취

[백준 / C언어] Day56. 1, 2, 3 더하기 (9095) 본문

코딩테스트/Daily Coding (C, C++)

[백준 / C언어] Day56. 1, 2, 3 더하기 (9095)

해린 2024. 7. 29. 02:12

2024. 07. 29 - 코딩테스트 스터디 Day56

 
 

01. 문제

정수 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의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오.
 
 

02. 입력

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

 
 

03. 출력

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

04-1. 예제 입력 1

3
4
7
10

 
 

04-2. 예제 출력 1

7
44
274

 
 

05. 풀이 및 답

우선 문제를 풀기 전, 규칙을 찾기 위해 몇 가지 정수의 1, 2, 3의 합으로 나타내는 방법의 수를 계산해 보았다.
 
n = 1 → 1개

  • 1

 
n = 2 2개

  • 1 + 1
  • 2

 
n = 3 4개

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

 
n = 4 7개

  • 문제에 나왔으니 생략

 
n = 5 13개

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

 
위를 통해 정수 n을 만드는 1, 2, 3의 합으로 나타내는 방법의 수는 
arr[n] = arr[n - 1] + arr[n - 2] + arr[n - 3]
으로 나타낼 수 있다는 것을 알 수 있다.
 
예를 들어

  • n이 4라면, (3을 만드는 방법의 수) + (2를 만드는 방법의 수) + (1을 만드는 방법의 수) = 4 + 2 + 1 = 7이므로 7개의 방법이 존재한다는 것을 알 수 있다. → 문제에 나온 것과 결과가 일치
  • n이 5라면, 7 + 4 + 2 = 13개의 방법이 존재한다. → 직접 구해본 값과 결과가 일치
  • n이 6이면, 13 + 7 + 4 = 24개의 방법이 존재한다.
  • n이 7이면, 24 + 13 + 7 = 44개의 방법이 존재한다. 예제에 나온 것과 결과가 일치

 
코드 전문

#include <stdio.h>

int main() {
	int t, n;
	scanf("%d", &t);

	int arr[11] = { 0 };

	arr[1] = 1;
	arr[2] = 2;
	arr[3] = 4;

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

	for (int i = 0; i < t; i++) {
		scanf("%d", &n);
		printf("%d\n", arr[n]);
	}

	return 0;
}

size가 11인 배열 arr를 선언한 후, 0으로 초기화한다.
arr[1], arr[2], arr[3]에 각각 1, 2, 4를 저장해 준다.
 
arr[4]부터 arr[10]까지의 값을 위에서 찾은 식을 사용하여 구한다.
 
이후, 입력받은 테스트 케이스의 개수만큼 반복문을 돌면서 입력받은 n값에 대한 arr[n] 값을 출력한다.
 
 

정답!