반응형

조합(Combination)

 

조합이란?

순서가 중요하지 않은 객체의 배열조합이라고 한다.
고등학교의 확률과 통계 과목에서는 '서로 다른 n개 중에서 순서에 상관없이 r개를 선택하는 경우의 수'라고 정의되어 있다.
조합(combination)과 순열(permutation)은 '순서의 중요성'이라는 차이가 있다.
예를 들어, 문자 A, B, C를 배열로 나열한다고 가정해보자. 이때 순열은 순서가 중요하기 때문에 배열 ABC와 배열 ACB는 다르다.
하지만 조합에서는 순서가 중요하지 않기 때문에 배열 ABC와 배열 ACB는 동일한 배열이 된다.
 

조합의 수를 계산하는 공식

https://www.onlinemathlearning.com/combinations.html

예제

 

백준 문제 풀이

조합의 개념이 사용된 백준 문제로는 1010번 '다리놓기' 문제가 있다.

1010번: 다리 놓기

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

www.acmicpc.net

문제

  • 재원이는 한 도시의 시장이 되었다. 이 도시에는 도시를 동쪽과 서쪽으로 나누는 큰 일직선 모양의 강이 흐르고 있다. 하지만 재원이는 다리가 없어서 시민들이 강을 건너는데 큰 불편을 겪고 있음을 알고 다리를 짓기로 결심하였다. 강 주변에서 다리를 짓기에 적합한 곳을 사이트라고 한다. 재원이는 강 주변을 면밀히 조사해 본 결과 강의 서쪽에는 N개의 사이트가 있고 동쪽에는 M개의 사이트가 있다는 것을 알았다. (N ≤ M)
  • 재원이는 서쪽의 사이트와 동쪽의 사이트를 다리로 연결하려고 한다. (이때 한 사이트에는 최대 한 개의 다리만 연결될 수 있다.) 재원이는 다리를 최대한 많이 지으려고 하기 때문에 서쪽의 사이트 개수만큼 (N개) 다리를 지으려고 한다. 다리끼리는 서로 겹쳐질 수 없다고 할 때 다리를 지을 수 있는 경우의 수를 구하는 프로그램을 작성하라.

 

해결 아이디어

m(강 동쪽의 사이트 개수)이 n(강 서쪽의 사이트 개수)보다 크기 때문에 최대 연결할 수 있는 다리의 개수는 n개이다.
문제를 잘 읽어보면 m개의 지역에 n개의 다리를 놓을 수 있는 경우의 수를 조합으로 구하면 된다는 것을 알 수 있다.
입력으로는 m, n을 입력받는데 식별성을 높이기 위해 변수 이름을 r과 n으로 바꾸어 각각 입력받도록 한다.
따라서, 해당 문제를 풀이의 수식은 nCr 으로 표현할 수 있고 이는 n! 을 (n-r)!r! 로 나눈 값이 된다.
 

코드 및 출력 결과

 

깃허브

https://github.com/PSLeon24/Baekjoon/blob/main/1010.py