본문 바로가기
백준 알고리즘 단계별 풀이 (문제 수)/기본 수학 1 (8)

[C++] 부녀회장이 될테야 : 2775번

by 17번 일개미 2022. 7. 4.
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