지난번엔 보글게임을 공부했습니다. 다음 문제인 소풍을 공부하려고 합니다.
https://algospot.com/judge/problem/read/PICNIC
6.3 문제 : 소풍 (ID : PICNIC, 난이도: 하)
문제 내용은 다음과 같아요.
소풍 ID : PICNIC
1. 테스트 케이스인 C 가 주어지고 그 다음 사람 수와 친구인 쌍의 갯수가 주어지내요.
C |
N M |
(x, y), (x1, y2), M |
3 |
2 1 |
0 1 |
0부터 N-1 까지의 학생들이 있으며, M 개의 쌍으로 입력이 되요.
친구의 순서는 상관이 없는 걸 것이고, 각 친구들의 친구 여부를 알려주내요.
2. 친구이며 쌍으로 나눌 수 있는 방법 ?
두번째 예제를 보면,
4 6 0 1 1 2 2 3 3 0 0 2 1 3
0 부터 3 까지 총 4 명의 아이들이 있고, 6 개의 쌍을 입력 받아요.
4 6 0 1 / 1 2 / 2 3 / 3 0 / 0 2 / 1 3
0 은 1, 3, 2 와 친구
1 은 0, 2, 3 과 친구
2 는 1, 3, 0 과 친구
3 은 2, 0, 1 과 친구 --> 결국 모두 친구이며, 4 명을 2 명 씩 뽑았을때
( 0, 1 / 2, 3 ), ( 0, 2 / 1, 3 ), ( 0, 3 / 1, 2 ) 으로 3가지 방법이 나오내요.
3. 완전 탐색
는... 아니었다....
1. 우선 선택되지 않은 1번째 인자를 선택
2. 1번째 인자 +1 (다음 것 [중복 방지])을 선택하여 친구 인지 , 쌍으로 나눴는지 확인..
3. 쌍으로 나눴던 것을 visited 배열에 저장
4. 1~3번을 재귀로 반복
5. 재귀 함수 내에서 1번 과정을 진행 했을때 모두 선택 되었다면, 전체 답 +1
* 1번째 인자를 고를 때 항상 맨 앞에 있는 친구를 고르고 , 2번째 인자 역시도, 선택 된 친구 다음 인자부터 확인 하기 때문에 순열이라기 보다 조합이다.
* 그래서 1,3 과 3,1 등이 중복되지 않는 듯 하다.
** 문제를 풀때 필요한 범위내에서 한정적으로 생각하기 보다 필요한 선택권을 재귀함수 내에서 자유롭게 선택해야 할듯하다...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | #include <iostream> using namespace std; int C,N,M,Answer=0; void dfs(); int visited[11] = {0,}; int checkFriend[11][11] = {0,}; int main(){ cin >> C; for(int tc=0; tc<C; tc++){ for(int i=0; i<11; i++){ for(int j=0; j<11; j++){ checkFriend[i][j] = 0; } visited[i] = 0; } Answer = 0; cin >> N >> M; for(int i=0; i<M; i++){ int Friend1, Friend2; cin >> Friend1 >> Friend2; checkFriend[Friend1][Friend2] = 1; checkFriend[Friend2][Friend1] = 1; } dfs(); cout << Answer << endl; } } void dfs(){ int idx1 = -1; for(int i=0; i<N; i++){ if(!visited[i]){ idx1 = i; break; } } if(idx1 == -1){ Answer += 1; return; } for(int idx2 = idx1+1; idx2<N; idx2++){ if(!visited[idx2] && checkFriend[idx1][idx2]){ visited[idx1] = 1; visited[idx2] = 1; dfs(); visited[idx2] = 0; visited[idx1] = 0; } } return; } | cs |
*** 난이도 : 하 인대도,,, 쉽게 내 머리 속에서 해결책이 나오지 않는다.... ㅠㅠ
'컴퓨터공학 > 알고리즘 공부' 카테고리의 다른 글
[CodeForce] Water The Garden .A 알고리즘 스터디 (0) | 2018.11.21 |
---|---|
[BOJ] 백준 문제풀이 15649 N과M(1) (0) | 2018.11.19 |
[알고리즘 문제 해결 전략] Part 1. 6장 무식하게 풀기 (0) | 2018.10.27 |
Quicksort 2 - Sorting Hackerrank 퀵정렬 퀵소트 문제! (0) | 2017.01.06 |
Quicksort 1 - Partition Hackerrank 퀵소트 퀵정렬 알고리즘 (0) | 2017.01.06 |