본문 바로가기

코딩/백준 BOJ

[백준/C언어] 2775번 - 부녀회장이 될테야

백준 웹사이트 "2775번 - 부녀회장이 될테야" 문제풀이입니다.

언어는 C언어입니다. (제출 언어: C99)

 


문제

 

2775번: 부녀회장이 될테야

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

www.acmicpc.net


소스 코드

#include <stdio.h>

int main(void){
    int T;
    scanf("%d", &T);

    for(int i=0; i<T; i++){
        int k, n;
        scanf("%d\n%d", &k, &n);
        
        // 1. 각 집 거주민 수 배열 선언/초기화
        int residents[k][n];
        for(int j1=0; j1<k; j1++){
            for(int j2=0; j2<n; j2++){
                if(j1==0){
                    residents[0][j2] = j2+1; // 0층 거주민 수 초기화
                }
                else{
                    residents[j1][j2] = 0; // 나머지 층 거주민 수 초기화
                }
            }
        }

        // 2. 반복문을 통해 각 집 거주민 수 계산
        for(int floor=1; floor<k; floor++){
            for(int num=0; num<n; num++){
                for(int prev_num=0; prev_num<=num; prev_num++){
                    residents[floor][num] += residents[floor-1][prev_num];
                }
                //printf("floor: %d, num: %d, residents: %d\n", floor, num+1, residents[floor][num]);
            }
        }

        // 3. k층 n호 거주민 수 출력
        int resident_num = 0;
        for(int count=0; count<n; count++){
            resident_num += residents[k-1][count];
        }
        printf("%d\n", resident_num);
    }
}

문제 풀이

  아래와 같이 단계적으로 문제를 풀어나가면 됩니다. 

 

1. 각 집 거주민 수 배열을 선언 및 초기화합니다.

  Line 12에서 선언한 'residents' 배열은 각 집의 거주민 수를 저장하기 위한 배열입니다. 'residents[k][n]'의 형태이므로, residents[a][b]는 a층의 b호에 거주하는 사람의 수입니다. Line 13 ~ 22에서는 residents 배열을 초기화합니다. 0층의 거주민 수는 정해져있으므로 조건대로 초기화를 하고, 그 외의 방은 모두 0으로 초기화합니다.

 

2. 반복문을 통해 각 집 거주민 수를 계산합니다.

  0층의 거주민 수는 주어지므로, 1층부터 k-1층까지, 각 층별로 1호부터 거주민 수를 계산합니다. 계산하는 방식은 문제 조건대로, 아래층의 1호부터 해당 집 호수까지 더합니다. 이렇게 중첩 루프(nested loop)를 완료하면, residents 배열에는 0층부터 k-1층까지 거주민 수가 저장됩니다.

 

3. k층 n호의 거주민 수를 출력합니다.

  마지막 k층 n호의 거주민 수는 k-1층의 0호부터 n호까지의 거주민 수를 더해주면 됩니다.

반응형