728x90
문제
평소 반상회에 참석하는 것을 좋아하는 주희는 이번 기회에 부녀회장이 되고 싶어 각 층의 사람들을 불러 모아 반상회를 주최하려고 한다.
이 아파트에 거주를 하려면 조건이 있는데, “a층의 b호에 살려면 자신의 아래(a-1)층의 1호부터 b호까지 사람들의 수의 합만큼 사람들을 데려와 살아야 한다” 는 계약 조항을 꼭 지키고 들어와야 한다.
아파트에 비어있는 집은 없고 모든 거주민들이 이 계약 조건을 지키고 왔다고 가정했을 때, 주어지는 양의 정수 k와 n에 대해 k층에 n호에는 몇 명이 살고 있는지 출력하라. 단, 아파트에는 0층부터 있고 각층에는 1호부터 있으며, 0층의 i호에는 i명이 산다.
문제 해석
3 층 | 1 | 5 | 15 | 35 |
2 층 | 1 | 4 | 10 | 20 |
1 층 | 1 | 3 | 6 | 10 |
0 층 | 1 | 2 | 3 | 4 |
이렇게 표를 그려보면 규칙을 찾을 수 있다.
구하고자 하는 곳의 사람 수는 아래층의 같은 호수 사람수 + 같은 층의 직전 호수 사람수 이다.
구하는 곳의 사람수 = 아래층 같은 호수 사람수 + 같은 층 직전 호수 사람수
문제의 범위는 최대 14층 14호 이므로, [14][14]의 2차원 배열에 모든 사람 수를 계산해 넣고
원하는 위치의 값을 뽑아낼 것이다.
풀이
#include <iostream>
using namespace std;
int main()
{
int testCase; // 테스트 케이스 수
int floor; // 층 수
int number; // 호수
int apart[15][15] = {0, }; // 아파트 [층 수]의 각 [호수] 배열
int* result;
cin >> testCase; // 테스트 케이스 입력
result = new int[testCase];
for (int j = 1; j <= 14; j++) // 0 층 초기ㅣ화
{
apart[0][j] = j;
}
for (int i = 0; i < testCase; i++) // 테스트케이스 만큼
{
cin >> floor;
cin.ignore();
cin >> number;
for (int j = 1; j <= 14; j++) // 1~14 층까지
{
for (int k = 1; k <= 14; k++) // 1~14호까지
{
apart[j][k] = apart[j - 1][k] + apart[j][k - 1];
} // 구하는 곳의 사람수 = 아래층 같은 호수 사람수 + 같은 층 전 호수 사람수
}
result[i] = apart[floor][number]; // 구하고자하는 곳의 결과를 저장
}
for (int i = 0; i < testCase; i++)
{
cout << result[i] << "\n"; // 결과 출력
}
delete[] result;
}
구하는 곳의 사람수 = 아래층 같은 호수 사람수 + 같은 층 직전 호수 사람수
를 다음과 같이 나타낼 수 있다.
for (int j = 1; j <= 14; j++) // 1~14 층까지
{
for (int k = 1; k <= 14; k++) // 1~14호까지
{
apart[j][k] = apart[j - 1][k] + apart[j][k - 1];
} // 구하는 곳의 사람수 = 아래층 같은 호수 사람수 + 같은 층 전 호수 사람수
}
728x90
'백준 알고리즘 단계별 풀이 (문제 수) > 기본 수학 1 (8)' 카테고리의 다른 글
[C++] 큰 수 A + B : 10757번 (0) | 2022.07.04 |
---|---|
[C++] 설탕 배달 : 2839번 (0) | 2022.07.04 |
[C++] ACM 호텔 : 10250번 (0) | 2022.07.04 |
[C++] 달팽이는 올라가고 싶다 : 2869번 (0) | 2022.07.04 |
[C++] 분수 찾기 : 1193번 (0) | 2022.07.04 |