소풍 문제

2022. 8. 29. 17:14·알고리즘 (with JAVA)/완전 탐색

1. 문제 설명

(1) 소풍 문제는 학생들을 두 명씩 짝 지어 목록을 만드는 것이다.

( 단, 항상 서로가 친구인 학생들끼리만 짞을 지어야 한다. )


(2) 최대한 구할 수 있는 모든 경우의 수를 만들어보자.

( 예) (a,b) (c,d) (e,f)와 (a,b) (c,e) (d,f)는 서로 다른 방법이다. )

 

 

 

2. 입출력 조건 및 예제

입력 조건

(1) 첫 번째 줄에는 총 입력 받을 소풍 문제 개수를 입력받는다.

 

(2) 두 번째 줄부터는 학생의 수 N과 친구의 쌍의 수 M을 입력 받는다.

( N >= 2 && N <= 10 ) ( M >= 0 && M <= N(N-1)/2 )

 

(3) 세 번째 줄부터는 서로가 친구인 목록을 적는다.

 

출력 조건

(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
 

 

 

 

3. 기저 사례

(1) 모든 학생의 짝을 찾았다면

 

 

 

4. 코드

public class PICNIC {
    // 각각 학생의 수, 친구의 쌍의 수, 서로 친구인지 확인하는 변수
    static int N, M;
    static boolean[][] isFriend;
    
    static BufferedReader sc = new BufferedReader(new InputStreamReader(System.in));
    static StringBuilder sb = new StringBuilder();
    static StringTokenizer st;
    
    public static void main(String[] args) throws Exception {
        int C = Integer.parseInt(sc.readLine());
        
        for(int i=0; i<C; i++){
            st = new StringTokenizer(sc.readLine());
            N = Integer.parseInt(st.nextToken());
            M = Integer.parseInt(st.nextToken());
            
            // 서로 친구인지 아닌지 확인하는 isFriend 변수에
            // 입력값을 저장한다.
            isFriend = new boolean[N][N];
            int[] A = new int[M*2];
            st = new StringTokenizer(sc.readLine());
            for(int k=0; k<M*2; k++) {
                A[k] = Integer.parseInt(st.nextToken());
                if(k%2==1) isFriend[A[k-1]][A[k]] = isFriend[A[k]][A[k-1]] = true;
            }
            sb.append(countPairings(new boolean[N])+"\n");
        }
        System.out.println(sb);
    }
    
    static int countPairings(boolean[] stu) {
        int ret=0, idx=-1;
        
        // 만약 짝이 없는 경우, idx에 학생 인덱스 위치를 저장한다.
        for(int i=0; i<N; i++) {
            if(!stu[i]) {
                idx=i;
                break;
            }
        }
        
        // 모든 학생이 짝을 이루었을 때
        // 하나의 경우의 수로 체크한다.
        if(idx==-1) return 1;
        
        // 짝을 짓지 못한 idx 위치에 있는 학생을 N만큼 짝을 이루도록 반복/재귀한다.
        for(int pairWith=idx+1; pairWith<N; pairWith++) {
            if(!stu[pairWith] && isFriend[idx][pairWith]) {
                stu[idx]=stu[pairWith]=true;
                ret += countPairings(stu);
                stu[idx]=stu[pairWith]=false;
            }
        }
        return ret;
    }
}
Colored by Color Scripter
cs

 

저작자표시 (새창열림)

'알고리즘 (with JAVA) > 완전 탐색' 카테고리의 다른 글

시계 맞추기 (골드1)  (0) 2022.08.31
외판원 문제(TSP, 실버1)  (0) 2022.08.30
게임판 덮기 (골드2)  (0) 2022.08.30
보글 게임 (골드2)  (0) 2022.08.29
n개의 원소 중 m개를 고르는 순열과 조합  (0) 2022.08.29
'알고리즘 (with JAVA)/완전 탐색' 카테고리의 다른 글
  • 외판원 문제(TSP, 실버1)
  • 게임판 덮기 (골드2)
  • 보글 게임 (골드2)
  • n개의 원소 중 m개를 고르는 순열과 조합
백_곰
백_곰
  • 백_곰
    친절한 코딩
    백_곰
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 알고리즘 (with JAVA)
        • 기본 알고리즘
        • 완전 탐색
        • 분할 정복 알고리즘
        • 동적 계획법
        • 탐욕법
        • 코딩 테스트 기출 문제
        • 코드트리 조별과제
      • 백준 (with JAVA)
        • 완전 탐색
        • 분할 정복
        • 그 외
      • 자바
        • 개발 환경 구축하기
        • 팁
        • 기본적인 개념
        • 컬렉션 프레임워크
        • 프로세스와 쓰레드
        • 지네릭스
        • 람다식
        • 스트림
        • 입출력 IO
        • 네트워킹
        • 열거형(enums)
        • java.lang 패키지
        • java.time 패키지
        • 유용한 클래스들
        • 형식화 클래스들
      • 안드로이드 with 자바
        • 응용 문제들
        • 자잘한 문제들
        • 오류 보고서
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      Collections Framework
      java.lang패키지
      코딩트리조별과제
      소켓 프로그래밍
      자바 개념
      람다식
      snail
      ServerSocket
      InputStream
      다형성
      안정 정렬
      선택 정렬
      안드로이드 스튜디오
      중간연산
      TCP 소켓 프로그래밍
      스트림
      outputstream
      알고스팟
      file
      코드트리
      유용한 클래스
      코딩테스트
      map()
      역직렬화
      serializable
      문자 기반 스트림
      불안정 정렬
      Arrays
      제자리 정렬
      java.time 패키지
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    백_곰
    소풍 문제
    상단으로

    티스토리툴바