본문 바로가기

code/2019 하계 알고리즘 캠프

Brute Force - 순열과 조합

스타와 링크 풀어보기

  n! ( = P(n, n) ) P(n, r) C(n, r) Pie(n, r)
경우의수 n! n!/(n-r)! n!/(n-r)!r! n^r
t복잡도 O(n!) O(n^r) O(n^min(r, n-r)) O(n^r)
백준풀이     BF - 순서 BF - 선택
lvl의미     선택한 개수 선택지 인덱스
r 간 순서 반영 무시 반영
결과정렬   인덱싱 0부터/N-1부터 선택먼저/비선택먼저
구현

std::next_permutation

혹은 직접 구현

(아래 코드 참조)

C(n, r)로 조합 구하고

next_permutation로 순서 정하기

 

BF(int i, int lvl){

   if(lvl > r)

      return

   for(;i < n; ++i) 

      BF(i + 1, lvl + 1);

}

BF(int lvl){

   if(lvl > r)

      return

   for(int i = 0;i < n; ++i) 

      BF(i + 1, lvl + 1);

}

자식 호출 횟수가 매번 다름(n번~n-r+1번)

자식 호출 횟수가 매번 같음(n번)

예시

백준17406 배열 돌리기 : K 개의 연산

백준 15649 N과 M(1)

백준 15650 N과 M(2)

백준 14502 연구소 : n 개의 빈칸 중 3개의 벽 선택

백준 16922 로마 숫자 만들기 : 4개 숫자(0~N) 선택

4가지 로마 숫자 종류, 각0~N개 까지 존재 가능

수학명칭 factorial

순열

조합

중복순열

수학풀이 서로 다른 n명을 일렬로 나열

서로 다른 n 명 중 r명을 일렬로 나열

서로다른 n 명 중 r명을 선택

서로 다른 n 명 중 r명을 중복을 허락하여 일렬로 나열