cs
CS/PS

[Algospot] 소풍(PICNIC)

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

 

algospot.com :: PICNIC

소풍 문제 정보 문제 안드로메다 유치원 익스프레스반에서는 다음 주에 율동공원으로 소풍을 갑니다. 원석 선생님은 소풍 때 학생들을 두 명씩 짝을 지어 행동하게 하려고 합니다. 그런데 서로

www.algospot.com

 

재귀 연습 문제이다.

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <stdio.h>
 
const int maxN = 15;
 
int c, n, m;
int pair[maxN][maxN];
 
void initPair() {
    for(int i =0; i<maxN; i++) {
        for(int j=0; j <maxN; j++
            pair[i][j]=0;
    }
}
 
int nextChild(int child[], int point) {
    for(int i = point; i<n; i++) {
        if(child[i]==1)return i;
    }
    return -1;
}
 
void makePair(int child[], int leftChild, int* numPair) {
    int pointChild= nextChild(child, 0); //standard point
    //printf("%d pc \n", pointChild);
    if(leftChild==2) {
        if(pair[pointChild][nextChild(child,pointChild+1)] == 1) {
            //printf("finalPair: %d %d\n", pointChild, nextChild(child,pointChild+1));
            (*numPair)++;
        }
    }
    else {
        for(int i=pointChild+1; i<n; i++) {
            if(pair[pointChild][i] == 1 && child[i]==1) { //if there is a pair with pointChild
                child[pointChild]=0, child[i]=0;
                //printf("Pair:%d %d\n", pointChild, i);
                makePair(child, leftChild-2, numPair);
                child[pointChild]=1; child[i]=1;
            }
        }
    }
    
}
 
int main () {
    
    int numPair=0;
    int child[maxN];
    int temp1, temp2;
    
    scanf("%d"&c);
    
    for(int i = 0; i < c; i++) {
        scanf("%d %d"&n, &m);
        initPair();
        for(int j = 0; j < m; j++) {
            scanf("%d %d"&temp1, &temp2);
            pair[temp1][temp2]=1pair[temp2][temp1]=1;
        }
        
        for(int j=0; j<n; j++) child[j]=1;
        
        numPair = 0;
        makePair(child, n, &numPair);
        printf("%d\n", numPair);
    }
}
cs

내 방법은 완전탐색을 하되, 수형도처럼 진행한다.

 

 

예를 들어 학생 A, B, C, D, E, F가 있다고 하면

A(pointChild)와 B가 친구인지 확인한 후(line 33), 친구이면 다음 학생으로 넘어간다.(nextChild)

A와 B는 이미 짝지어져 있으므로(child[i]==0) C로 넘어가서 C와 D가 친구인지 확인한다. 만약 친구가 아니라면 C와 E가 친구인지 확인한다.

그러다 남은 학생이 2명이고, 둘이 친구라면, pair의 개수를 1개 카운트하고 리턴한다.(line 28)

 

 

nextChild()에서 더 빠르게 찾는 방법이 있을 것 같지만 n이 매우 작으므로 그냥 진행하였다.

'CS > PS' 카테고리의 다른 글

[BOJ] 1028번 : 다이아몬드 광산  (0) 2021.07.05
[BOJ] 1005번 : ACM craft  (0) 2021.07.04
[BOJ] 1074번 : Z  (0) 2021.07.03
[BOJ] 1725번 : 히스토그램  (0) 2021.07.02
[BOJ] 1449번 : 수리공 항승  (0) 2021.07.02