[알고리즘 문제해결 전략]6장. 무식하게 풀기_③
2018. 12. 29. 15:48ㆍAlgorithm/알고리즘 문제해결 전략
PICNIC in algospot
problem
Tinking
우선, 완전탐색을 목표로 예상 최대시간을 계산해 보자. 총 학생의 수는 최대 10명이다. 그러면 모든 경우의 수를 고려해보는 경우의 수는 아래와 동일 하다.
(10 C 2) * (8 C 2) * (6 C 2) * (4 C 2) * (2 C 2) = 113400
즉 컴퓨터의 시간으로는 해결가능한 문제이다. 하지만, 중복의 문제가 발생한다. 이는 4명의 친구들을 예로 생각해보자.
학생 1 2 3 4
가능한 쌍 (정답)
(1, 2) (3, 4)
(1, 3) (2, 4)
(1, 4) (2, 3)
위의 아이디어로 나올 수 있는 경우의 수
(1, 2) (3, 4)
(1, 3) (2, 4)
(1, 4) (2, 3)
(2, 3) (4, 1)
(2, 4) (3, 1)
(3, 4) (2, 1)
하지만 , 4C2 * 2C2를 계산해보면 6 즉, 중복이 발생한다. 이를 해결하기 위해 다른 방법을 모색해보자.
학생 1, 2, 3, 4를 정렬한 후, 무조건 본인의 뒤에 있는 학생을 선택해서 경우의 수를 구해보자.
(1, 2) (3, 4)
(1, 3) (2, 4)
(1, 4) (2, 3)
자, 그러면 학생 6명에 대해서도 생각해보자
학생 1,2,3,4,5,6
경우의 수
(1, 2) (3, 4) (5, 6)
(1, 2) (3, 5) (4, 6)
(1, 2) (3, 6) (4, 5)
(1, 3) (2, 4) (5, 6)
(1, 3) (2, 5) (4, 6)
(1, 3) (2, 6) (4, 5)
(1, 4) (2, 3) (5, 6)
(1, 4) (2, 5) (3, 6)
(1, 4) (2, 6) (3, 5)
(1, 5) (2, 3) (4, 6)
(1, 5) (2, 4) (3, 6)
(1, 5) (2, 6) (3, 4)
(1, 6) (2, 3) (4, 5)
(1, 6) (2, 4) (3, 5)
(1, 6) (2, 5) (3, 4)
총 15가지의 경우 즉, 6 C 2 * 4 C 2* 2 C 2 * 1/3! = 15 가 맞다.
자, 그렇다면 해당 경우만 우선 구현을 해보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | int ans = 0; int friends[N][N] //친구 여부 확인 int selected[N] // 선택된 친구인지 아닌지 void solve() { int first_sel = -1; for (int i = 0; i < N; i++) {//숫자들 중 선택되지 않은 가장 작은 번호의 친구를 고른다. if (selected[i] == 0) { first_sel = i; break; } } if (first_sel == -1) {//모든 친구들의 짝이 있을 경우 하나의 답이 만들어 진것이므로 ans++를 해준다. ans++; return; } for (int pair = first_sel + 1; pair < N; pair++) {// first_sel의 번호보다 큰 번호의 친구를 탐색한다. if ((selected[pair] == 0) && (friends[pair][first_sel] == 1)) {//친구가 선택되지 않았고 first_sel의 친구와 해당 친구가 서로 친구인 경우 짝을 이루게 한다. selected[pair] = selected[first_sel] = 1; solve();//다음의 짝을 찾지못한 친구를 찾기위해 다시 함수를 부른다. selected[pair] = selected[first_sel] = 0; } } } | cs |
[코드 1 PICNIC 핵심 코드]
Solve
출처
문제: algosport PICNIC문제( 링크 )
'Algorithm > 알고리즘 문제해결 전략' 카테고리의 다른 글
[알고리즘 문제해결 전략]6장. 무식하게 풀기_⑤ (0) | 2018.12.30 |
---|---|
[알고리즘 문제해결 전략]6장. 무식하게 풀기_④ (0) | 2018.12.29 |
[알고리즘 문제해결 전략]6장. 무식하게 풀기_② (0) | 2018.12.29 |
[알고리즘 문제해결 전략]6장. 무식하게 풀기_① (0) | 2018.12.28 |
[알고리즘 문제해결 전략]5장. 알고리즘의 정당성 증명 (0) | 2018.12.27 |