백준/c

백준_2775_부녀회장이될테야

S0LL 2024. 4. 28. 16:58

 

규칙이 있는 아파트 문제입니다.

 

a층의 b 호에 살기 위해서는 a-1층의 1호~b호 까지의 사람의 합 만큼 사람을 데려와야 한다는 규칙이 있습니다.

 

처음에는 반복문을 통해 시그마를 구현하고 하나하나 다 더해서 풀어야 하나 생각을 했지만 더 간단한 방법이 있었습니다.

 

아파트를 표로 구현해보았습니다.

아래 표에서 규칙을 찾으면, 문제를 쉽게 풀 수 있을 것 같습니다.

2층 1명 4명 10명 20명 35명 56명 84명 120명 165명
1층 1명 3명 6명 10명 15명 21명 28명 36명 45명
0층 1명 2명 3명 4명 5명 6명 7명 8명 9명
  __1호 __2호 __3호 __4호 __5호 __6호 __7호 __8호 __9호

 

규칙이 보이시나요??

 

해당 호수에 몇명이 살고 있는지 구하기 위해서는, 같은 층의 이전 호수와, 바로 아래층의 같은 호수에 살고 있는 사람 수를 더하면 됩니다.

 

위의 표를 2차원 배열 apt[14][14] 라고 한다면 , apt[i][j] = apt[i-1][j] + apt[i][j-1] 이 되겠죠.

 

배열의 크기를 14x14 로 한 이유는 문제에서 범위를 정해주었기 때문입니다. 

 

이를 코드로 구현해보면 다음과 같습니다.

 

먼저 __1 호의 사람수는 항상 1명이므로, 1로 초기화를 해주고 

0층에 사는 사람의 명수까지 초기화해주었습니다.

 

그 후 위의 규칙을 통해 사람 수를 배열에 채워 넣는 과정입니다.

    int apt[15][15] = {0}; // 아파트 배열

    for (int i = 0; i < 15; i++)
    {
        apt[0][i] = i + 1;
        apt[i][0] = 1;
    }

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

 

 

이 과정이 끝나면, 호수를 입력받아 사람 수를 출력만 하면 문제를 해결할 수 있겠죠.

 

 

전체 코드)

#include <stdio.h>

int main(void)
{
    int apt[15][15] = {0}; // 아파트 배열

    for (int i = 0; i < 15; i++)
    {
        apt[0][i] = i + 1;
        apt[i][0] = 1;
    }

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

    int T, k, n;

    scanf("%d", &T);

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

    return 0;
}

 

 

규칙만 파악하면 어렵지 않게 풀 수 있는 문제인 것 같습니다.

'백준 > c' 카테고리의 다른 글

백준_2751_수정렬하기2_(radixSort)  (2) 2024.05.01
백준_10845_큐(queue)  (0) 2024.05.01
백준_2869_달팽이는올라가고싶어  (2) 2024.04.28
백준_1259_팰린드롬수  (0) 2024.04.25
백준_10811_바구니뒤집기  (0) 2024.04.24