알고리즘/문제 풀이

1010번: 다리 놓기

Themion 2021. 12. 5. 20:42

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

 

1010번: 다리 놓기

입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 강의 서쪽과 동쪽에 있는 사이트의 개수 정수 N, M (0 < N ≤ M < 30)이 주어진다.

www.acmicpc.net

동쪽에 있는 M개의 사이트 중 N개의 사이트를 골라야 하고, 고르는 순서는 상관이 없으므로 주어진 문제는 조합 문제로 볼 수 있다.

N과 M의 범위가 30 이하이므로, 파스칼의 삼각형을 이용해 가능한 모든 경우를 탐색한 뒤 테스트 케이스를 진행하면 편하다.

#include <cstdio>

#define MAX_N 30
#define FOR(i, a, b) for(i = a; i < b; i++)

// tri[N][K]: 파스칼의 삼각형을 이용해 조합을 계산
int tri[MAX_N + 1][MAX_N + 1];

int main() {
    // T: 테스트 케이스의 수
    // N, M: 각각 서쪽, 동쪽의 사이트의 개수
    int T, N, M, n, k;
    
    FOR(n, 0, MAX_N) {
        // 이전 값을 탐색할 수 없는 nC0은 하드 코딩으로 초기화
        tri[n][0] = 1;
        // nCk = (n - 1)C(k - 1) + (N - 1)Ck
        FOR(k, 1, n) tri[n][k] = tri[n - 1][k - 1] + tri[n - 1][k];
    }

    scanf("%d", &T);
    while (T--) {
        // 조합을 구할 N과 M을 입력받은 뒤
        scanf("%d %d", &N, &M);
        // 해당 테스트 케이스의 컴비네이선을 출력한다
        printf("%d\n", tri[M][N]);
    }

    return 0;
}

'알고리즘 > 문제 풀이' 카테고리의 다른 글

1012번: 유기농 배추  (0) 2021.12.05
1011번: Fly me to the Alpha Centauri  (0) 2021.12.05
1009번: 분산처리  (0) 2021.12.05
1008번: A/B  (0) 2021.12.05
1005번: ACM Craft  (0) 2021.12.05