saurus2
Saurus2
saurus2
전체 방문자
오늘
어제
  • 분류 전체보기
    • 개발
      • AJAX
    • ML Ops
    • Profile
    • 음식점
    • 배낭여행
    • 컴퓨터공학
      • 알고리즘 공부
      • C++
      • Sever 스터디
      • Java spring
      • 알고리즘 _ 문제해결
      • 딥러닝
      • Java 정리
      • Python
      • LeetCode 1000
      • Machine Learning Study
      • Sign language Detection Pro..
      • LeetCode Solutions
    • 비콘
    • 데일리 리포트
    • 유학일기
      • 영어 공부
      • Daily
    • AI Master Degree
      • Data Mining
      • AI and Data engineering
      • Math Foundations for Decisi..
      • Natural Language Processing

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

인기 글

태그

  • BFS
  • 알고리즘문제해결
  • 백준
  • 파이썬
  • 취업준비
  • 딥러닝
  • two pointer
  • 문제해결능력
  • 리트코드
  • 개발자 취업준비
  • DFS
  • Python
  • 릿코드
  • 알고리즘
  • 개발자
  • 취준
  • c++
  • 딕셔너리
  • LeetCode
  • 온라인저지

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
saurus2

Saurus2

컴퓨터공학/알고리즘 공부

[알고리즘 문제 해결 전략] Part 1. 6장 무식하게 풀기 [소풍]

2018. 11. 12. 23:44

지난번엔 보글게임을 공부했습니다. 다음 문제인 소풍을 공부하려고 합니다. 

https://algospot.com/judge/problem/read/PICNIC

6.3 문제 : 소풍 (ID : PICNIC, 난이도: 하)

문제 내용은 다음과 같아요. 


소풍 ID : PICNIC




문제

안드로메다 유치원 익스프레스반에서는 다음 주에 율동공원으로 소풍을 갑니다. 원석 선생님은 소풍 때 학생들을 두 명씩 짝을 지어 행동하게 하려고 합니다. 그런데 서로 친구가 아닌 학생들끼리 짝을 지어 주면 서로 싸우거나 같이 돌아다니지 않기 때문에, 항상 서로 친구인 학생들끼리만 짝을 지어 줘야 합니다.

각 학생들의 쌍에 대해 이들이 서로 친구인지 여부가 주어질 때, 학생들을 짝지어줄 수 있는 방법의 수를 계산하는 프로그램을 작성하세요. 짝이 되는 학생들이 일부만 다르더라도 다른 방법이라고 봅니다. 예를 들어 다음 두 가지 방법은 서로 다른 방법입니다.

  • (태연,제시카) (써니,티파니) (효연,유리)
  • (태연,제시카) (써니,유리) (효연,티파니)

입력

입력의 첫 줄에는 테스트 케이스의 수 C (C <= 50) 가 주어집니다. 각 테스트 케이스의 첫 줄에는 학생의 수 n (2 <= n <= 10) 과 친구 쌍의 수 m (0 <= m <= n*(n-1)/2) 이 주어집니다. 그 다음 줄에 m 개의 정수 쌍으로 서로 친구인 두 학생의 번호가 주어집니다. 번호는 모두 0 부터 n-1 사이의 정수이고, 같은 쌍은 입력에 두 번 주어지지 않습니다. 학생들의 수는 짝수입니다.

출력

각 테스트 케이스마다 한 줄에 모든 학생을 친구끼리만 짝지어줄 수 있는 방법의 수를 출력합니다.

예제 입력

3 
2 1 
0 1 
4 6 
0 1 1 2 2 3 3 0 0 2 1 3 
6 10 
0 1 0 2 1 2 1 3 1 4 2 3 2 4 3 4 3 5 4 5

예제 출력

1
3
4


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. 완전 탐색

Index 0 부터 순차적으로 확인하면서, 친구일 경우 쌍으로 짝을 지어줘요. 그리고 

체크를 한뒤에 다음 Index 로 넘어 갑니다. 다음 Index 에서 그 친구가 체크가 되어 있다면 건너 뛰면 될 것 같내요.

쌍을 만들어 줬을때 쌍의 갯수를 + 1 해주고 아이들 전체가 쌍이 이루어진 갯 수와 같으면 끝내죠.


는... 아니었다....

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;
}
 
Colored by Color Scripter
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
    '컴퓨터공학/알고리즘 공부' 카테고리의 다른 글
    • [CodeForce] Water The Garden .A 알고리즘 스터디
    • [BOJ] 백준 문제풀이 15649 N과M(1)
    • [알고리즘 문제 해결 전략] Part 1. 6장 무식하게 풀기
    • Quicksort 2 - Sorting Hackerrank 퀵정렬 퀵소트 문제!
    saurus2
    saurus2
    Simple is Best

    티스토리툴바