백준

백준 2775: 부녀회장이 될테야(java/C)

unhyepnhj 2024. 7. 6. 15:32

문제

 

풀이

 

2차원 배열을 사용해 풀 수 있을 것 같다

 

우선 k층 n호의 사람 수를 정리해 보면 아래와 같다.

각 호실 별 사람 수를 저장할 int형 2차원 배열 aptArr를 설정했으며

 

층수에 관계없이 1호는 항상 1명이 거주하고, 0층의 k호에는 k명이 거주한다.

그 외의 경우 (같은 층 바로 전 호의 사람 수) + (아래 층 같은 호의 사람 수)인 것을 알 수 있으므로

aptArr[0][n]=n;		//0층 n호는 n명
aptArr[k][1]=1;		//1호는 항상 1명
aptArr[k][n]=aptArr[k][n-1]+aptArr[k-1][n];

로 정리할 수 있다.

 

for문을 사용하여 aptArr 배열을 먼저 완성한 다음, T 횟수만큼 k와 n을 입력받아 해당하는 호실의 사람을 꺼내 오는 방식으로 풀이하였다.

 

[JAVA]

실행 시간을 줄이기 위해 Scanner 대신 BufferedReader를 사용

Scanner 사용하려면 main함수 헤더에서 throws IOException 지우고 사용하면 된다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	public static void main(String[] args) throws IOException{
		BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
		
		int[][] aptArr=new int[15][15];
		
		for(int i=0; i<15; i++) {
			aptArr[0][i]=i;
			aptArr[i][1]=1;
		}
		for(int k=1; k<15; k++) {
			for(int n=2; n<15; n++) {
				aptArr[k][n]=aptArr[k][n-1]+aptArr[k-1][n];
			}
		}
		
        int T=Integer.parseInt(in.readLine());
		for(int i=0; i<T; i++) {
			int k=Integer.parseInt(in.readLine());
			int n=Integer.parseInt(in.readLine());
			System.out.println(aptArr[k][n]);
		}
	}
}

 

[C]

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main(void) {
	int T, k, n;

	int aptArr[15][15];
	for (int i = 0; i < 15; i++) {
		aptArr[0][i] = i;
		aptArr[i][1] = 1;
	}
	for (int k = 1; k < 15; k++) {
		for (int n = 2; n < 15; n++) {
			aptArr[k][n] = aptArr[k][n - 1] + aptArr[k - 1][n];
		}
	}

	scanf("%d", &T);
	for (int i = 0; i < T; i++) {
		scanf("%d", &k);
		scanf("%d", &n);
		printf("%d\n", aptArr[k][n]);
	}
    
    return 0;
}