발자취
[백준 / C언어] Day56. 1, 2, 3 더하기 (9095) 본문
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] 값을 출력한다.

정답!

끝
'코딩테스트 > Daily Coding (C, C++)' 카테고리의 다른 글
| [프로그래머스 Lv.3 / C++] Day58. 디스크 컨트롤러 (0) | 2024.07.31 |
|---|---|
| [프로그래머스 Lv.2 / C++] Day57. 더 맵게 (0) | 2024.07.30 |
| [백준 / C언어] Day55. 수 이어 쓰기 1 (1748) (0) | 2024.07.28 |
| [백준 / C언어] Day54. 카잉 달력 (6064) (0) | 2024.07.27 |
| [프로그래머스 Lv.1 / C++] Day53. 행렬의 덧셈 (0) | 2024.07.26 |