[백준] 2775번 : 부녀회장이 될테야

업데이트:

문제

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

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

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

입력

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

출력

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

예제 입력 1

2
1
3
2
3

예제 출력 1

6
10

잘못된 풀이

#define _CRT_SECURE_NO_WARNINGS
#include  <stdio.h>

int cal(int, int);

int cal(int k, int n) {
	int res = 0;
	int count = 1;

	for (int i = 0; i <= k; i++) {
		for (int j = 1; j <= count; j++) {
			res += j;
			if (count > n) break;
		}
		count++;
	}
	return res;
}



int main() {
	int Test;
	int k = 0, n = 0;

	scanf("%d", &Test);

	for (int i = 0; i < Test; i++) {
		scanf("%d", &k);
		scanf("%d", &n);
		int res = cal(k, n);
		printf("%d\n", res);
	}
}

알고리즘 [ 접근방법 ]

일단 첫번째 풀이는 틀렸다.. 처음에 문제풀이를 구상한 것은 다음과 같다.

enter image description here


건물의 호수마다 들어가는 인원수를 그린 그림이다. 처음에는 2층까지만 생각을 해보고 규칙을 판단해서 1부터 호수까지의 수를 계속해서 더하면 되겠다 생각했다. 즉 2층 4호를 예시로 보면 1 / 1+2 / 1+2+3 / 1+2+3+4 이런 규칙을 볼 수 있는 것처럼 다른 호수에도 똑같은 규칙을 적용해 코드를 짰다.

그러나 3층만 보더라도 위의 규칙이 적용 안되기 때문에 다른 규칙을 찾아야만 했다. 솔직히 못찾았다. 그래서 다른 사람의 풀이를 스윽 참고를 했는데 생각보다 간단한 규칙이였다.

풀이

#define _CRT_SECURE_NO_WARNINGS
#include  <stdio.h>

int cal(int, int);

int cal(int k, int n) {
	
	int arr[15][15] = { 0, };
	
	for (int i = 0; i < 15; i++) {
		arr[0][i] = i;	// 0층의 i호에는 i명이 산다
	}

	// 바로 직전 방과 아래방을 합한값이 현재 방의 인원수이다
	for (int i = 1; i < 15; i++) {
		for (int j = 1; j < 15; j++) {
			arr[i][j] = arr[i - 1][j] + arr[i][j - 1];
		}
	}

	return arr[k][n];
}



int main() {
	int Test;
	int k = 0, n = 0;

	scanf("%d", &Test);

	for (int i = 0; i < Test; i++) {
		scanf("%d", &k);
		scanf("%d", &n);
		int res = cal(k, n);
		printf("%d\n", res);
	}
}


알고리즘 [ 접근방법 ]

1_ 모든 호수의 인원수를 이중배열에 넣어주고 일단 0으로 초기화 시킨다.
2_ 0층의 i호에는 i명이 산다고 했으므로 이를 정의한다.
3_ 현재방의 인원수는 바로 직전호수방의 인원수 + 바로 아래방의 인원수 임을 확인하고 이를 정의한다.

for (int i = 1; i < 15; i++) {
	for (int j = 1; j < 15; j++) {
		arr[i][j] = arr[i - 1][j] + arr[i][j - 1];
	}
}




요즘은 수학공식을 사용하는 문제를 계속 풀어보고 있는데 확실히 문제마다의 규칙을 찾아내는것이 관건인것 같다. 앞선 벌집문제도 그렇고 이문제도 그렇고 코딩 자체는 어렵지 않지만 그 규칙을 알아내기가 가장 어려운것 같다. 문제를 많이 풀어보는 수 밖에…

댓글남기기