무식하게 풀기란, 말그대로 모든 경우의 수를 구한 후 정답에 해당되는 항들만 골라 출력하는 형식입니다. 그렇기 때문에 순환(recursive)문을 많이 이용을 합니다.
이 문제에서도 N명의 학생들 중 M개의 친구 관계가 있고, 이 친구 관계를 고려하였을 때 친구끼리만 짝지어줄 수 있는 방법들을 무식하게 풀어내야만 하죠...... 프.알.문 책에서는
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | int n,m; bool areFriends[10][10]; int countPairings(bool taken[10]) { int firstFree = -1; for (int i = 0; i < n; ++i) { if (!taken[i]) { firstFree = i; break; } } //기저사례 : 모두 짝이 있는 경우 if (firstFree == -1) return 1; int ret = 0; for (int pairWith = firstFree + 1; pairWith < n; ++pairWith) { if (!taken[pairWith] && areFriends[firstFree][pairWith]) { taken[firstFree] = taken[pairWith] = true; ret += countPairings(taken); taken[firstFree] = taken[pairWith] = false; } } return ret; } | cs |
MY QUESTION?
이러한 방식으로 areFirends[][] 와 firstFree, taken을 이용하여 countPairings라는 순환호출함수를 만들어주었습니다.
제가 여기서 궁금했던 점은 ret 인데요.... ret이 처음에 0을 선언되고 ret +=countPairings(taken) 부분에서 ret이 어떻게 계속 증가하는지 궁금했습니다. 말 그대로 0+0=0? 아닌가라는 의문을 갖게 되었습니다.
과연 어떻게 ret은 경우의 수가 있다면 계속 증가 할 수 있었을까요??
많은 고민 끝에 if(firstFree == -1) return 1;에서 해답을 찾을 수 있었습니다. 순환호출함수에서 가장 중요한 것은 빠져 나올 수 있는 기저사례를 만들어주는 것인데 위 문제의 기저사례는 모든 학생들이 짝을 찾았을 경우였기 때문에 firstFree==-1을 이용해 기저사례를 정해주었고, 이 때문에 한가지 경우의 수마다 1씩 증가 할 수 있었던 것이였습니다!!
이 방식을 통해 최종적으로 완성해본 코드입니다.
|
RESULT :
1 2 3 4 5 6 7 8 9 10 | 3 2 1 0 1 1 4 6 0 1 1 2 2 3 3 0 0 2 1 3 3 6 10 0 1 0 2 1 2 1 3 1 4 2 3 2 4 3 4 3 5 4 5 4 | cs |
궁금하신 것이 있으시다면 댓글로 남겨주세요!~
반응형
'Algorithm > Problem and Strategies' 카테고리의 다른 글
[백준] 10942번 - 팰린드롬? (2) | 2020.02.16 |
---|---|
[백준] 1725번 히스토그램 & [프알문] 울타리 잘라내기 (0) | 2020.01.29 |
[백준] 1780번 종이의 개수 (0) | 2020.01.25 |
[백준] 1012번 유기농 배추 (0) | 2020.01.23 |
[백준] 2503번 숫자 야구 (0) | 2020.01.14 |