728x90
728x90
문제
평소 반상회에 참석하는 것을 좋아하는 주희는 이번 기회에 부녀회장이 되고 싶어 각 층의 사람들을 불러 모아 반상회를 주최하려고 한다.
이 아파트에 거주를 하려면 조건이 있는데, “a층의 b호에 살려면 자신의 아래(a-1)층의 1호부터 b호까지 사람들의 수의 합만큼 사람들을 데려와 살아야 한다” 는 계약 조항을 꼭 지키고 들어와야 한다.
아파트에 비어있는 집은 없고 모든 거주민들이 이 계약 조건을 지키고 왔다고 가정했을 때, 주어지는 양의 정수 k와 n에 대해 k층에 n호에는 몇 명이 살고 있는지 출력하라. 단, 아파트에는 0층부터 있고 각층에는 1호부터 있으며, 0층의 i호에는 i명이 산다.
입력
첫 번째 줄에 Test case의 수 T가 주어진다. 그리고 각각의 케이스마다 입력으로 첫 번째 줄에 정수 k, 두 번째 줄에 정수 n이 주어진다
출력
각각의 Test case에 대해서 해당 집에 거주민 수를 출력하라.
제한
- 1 ≤ k, n ≤ 14
예제 입력 1
2
1
3
2
3
예제 출력 1
6
10
알고리즘 분류
- 수하
- 구현
- 다이나믹 프로그래밍
문제 출처
https://www.acmicpc.net/problem/2775
문제 해결 방법
- 문제의 규칙을 발견하면 쉽게 풀 수 있는 문제였다.
- 아파트의 크기가 14 x 14 로 비교적 작아 2차원 배열을 생성한 후, 각 호의 인원을 계산해서 각 배열의 요소에 넣고, 입력 받은 k와 n의 값에 따라 해당 배열에 있는 요소를 출력시키는 방법으로 문제를 해결하였다.
... | ... | ... | ... | ... | ... |
1층 | 1 | 1 + 2 | 1 + 2 + 3 | 1 + 2 + 3 + 4 | ... |
0층 | 1 | 2 | 3 | 4 | ... |
1호 | 2호 | 3호 | 4호 | ... |
코드
#include <iostream>
using namespace std;
int T, k, n, apt[15][15], sum;
// ...
// [1][3][6][10]...[1 + 2 + 3 + ... + 14]
// [1][2][3][4][5][6][7][8][9][10][11][12][13][14]
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
for (int i = 0; i < 15; i++) {
apt[0][i] = i + 1;
}
for (int i = 1; i < 15; i++) {
for (int j = 0; j < 15; j++) {
sum = 0;
for (int k = 0; k <= j; k++) {
sum += apt[i - 1][k];
}
apt[i][j] = sum;
}
}
cin >> T;
for (int i = 0; i < T; i++) {
cin >> k;
cin >> n;
cout << apt[k][n - 1] << '\n';
}
return 0;
}
채점 결과
참고
- [단계별로 풀어보기] > [기본 수학 1]
- 브론즈I
728x90
728x90
'Problem Solving > BOJ' 카테고리의 다른 글
[BOJ-11653][C++] 소인수분해 (0) | 2022.10.25 |
---|---|
[BOJ-2581][C++] 소수 (0) | 2022.10.25 |
[BOJ-1978][C++] 소수 찾기 (0) | 2022.10.25 |
[BOJ-2830][C++] 설탕 배달 (0) | 2022.10.24 |
[BOJ-10250][C++] ACM 호텔 (0) | 2022.10.24 |
[BOJ-2869][C++] 달팽이는 올라가고 싶다 (0) | 2022.10.24 |
[BOJ-1193][C++] 분수찾기 (0) | 2022.10.24 |
[BOJ-2563][C++] 색종이 (0) | 2022.10.24 |