Giken Dev
article thumbnail
반응형

https://www.acmicpc.net/problem/2775

 

2775번: 부녀회장이 될테야

첫 번째 줄에 Test case의 수 T가 주어진다. 그리고 각각의 케이스마다 입력으로 첫 번째 줄에 정수 k, 두 번째 줄에 정수 n이 주어진다

www.acmicpc.net

문제

평소 반상회에 참석하는 것을 좋아하는 주희는 이번 기회에 부녀회장이 되고 싶어 각 층의 사람들을 불러 모아 반상회를 주최하려고 한다.

이 아파트에 거주를 하려면 조건이 있는데, “a층의 b호에 살려면 자신의 아래(a-1)층의 1호부터 b호까지 사람들의 수의 합만큼 사람들을 데려와 살아야 한다” 는 계약 조항을 꼭 지키고 들어와야 한다.

아파트에 비어있는 집은 없고 모든 거주민들이 이 계약 조건을 지키고 왔다고 가정했을 때, 주어지는 양의 정수 k와 n에 대해 k층에 n호에는 몇 명이 살고 있는지 출력하라. 단, 아파트에는 0층부터 있고 각층에는 1호부터 있으며, 0층의 i호에는 i명이 산다.

입력

첫 번째 줄에 Test case의 수 T가 주어진다. 그리고 각각의 케이스마다 입력으로 첫 번째 줄에 정수 k, 두 번째 줄에 정수 n이 주어진다

출력

각각의 Test case에 대해서 해당 집에 거주민 수를 출력하라.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
	int test, k, n;		//k층(행) n호(열)
	int num_person[15][14] = { 0 };

	scanf("%d", &test);

	for (int i = 0; i <= 13; i++) {		//0층 초기화
		num_person[14][i] = i + 1;
	}

	for (int i = 0; i <= 14; i++) {		//1호 2호 초기화
		num_person[i][0] = 1;
		num_person[i][1] = 16 - i;
	}

	for (int a = 13; a >= 0; a--) {		// 나머지 초기화
		for (int b = 2; b <= 13; b++) {
			for (int c = 0; c <= b; c++) {
				num_person[a][b] += num_person[a + 1][c];
			}
		}
	}

	for (int i = 0; i < test; i++) {	
		scanf("%d %d", &k, &n);

		printf("%d\n", num_person[14 - k][n - 1]);
	}
}

문제풀이

먼저, 15 x 14 크기의 배열을 선언하여 모든 값을 구해놓고 마지막에 층, 호에 맞는 값을 출력하기로 했습니다.

  1. 규칙성을 따져보면 0층 그리고 1호 2호는 간단한 값을 가지므로 초기화를 먼저 합니다. 
  2. 0층, 1호, 2호 라인을 토대로 나머지 층,호를 계산하면 되겠습니다.

여기서 for문을 3번이나 쓰게 된 이유는 2차원배열을 다루기위해 2번, 그리고 누적되는 덧셈을 위해 1번 총 3번 쓰게 됐습니다.

비고

0층 시작 그리고 1호 시작,  0층은 14행 1호 0열 << 따위의 사실에 멘붕이 올 수 있습니다..

반응형
profile

Giken Dev

@기켄

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!