집합 관리 > 문제은행



문제은행

3292 : 집합 관리

제한시간: 3000 ms    메모리제한: 128 MB
해결횟수: 6 회    시도횟수: 28 회   



음이 아닌 정수를 원소로 하는 최대 32개까지 담을 수 있는 집합이 있다.

집합에 담긴 원소는 유일해야 하므로 같은 원소를 포함하지 않는다.

집합에 담기는 원소는 0 ~ 31까지의 정수이다. 

따라서 주어지는 주어진 정수가 31을 초과하는 경우 32로 나눈 나머지로 계산한다.

 

사용자 프로그램(user.cpp)은 아래 api 함수를 완성 해야 한다.

사용자 프로그램은 헤더파일을 추가할 수 없다. 

필요한 함수와 변수를 추가하여 작성할 수 있으나 제출시에 함께 제출한다.

 

[user.cpp 템플릿 코드]

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
/// === user.cpp ===
/// 각 테스트 케이스에 대하여 1번 호출된다. 집합을 공집합으로 만든다.
 
void Init(){
 
}
 
/// 집합에 포함된 모든 원소들을 삭제하고 기존에 없었던 원소들을 추가한다.
void Flip(){
 
}
 
/// 집합에 원소 k가 없다면 추가, 있다면 아무일도 하지 않는다.
void Insert(int k){
 
}
 
/// 집합에 원소 k가 있다면 삭제, 없다면 아무일도 하지 않는다.
void Erase(int k){
 
}
 
/// 집합에 원소 k가 집합안에 있다면 1, 없다면 0을 반환한다.
int Find(int k){
 
}
 
/// 집합에 원소 k가 없다면 추가, 있다면 삭제한다.
void Inverse(int k){
 
}
 
/// 집합에 모든 원소를 삭제하고 기존 원소에 k를 더한 원소들로 채운다.
/// k를 더한 원소가 31을 초과하는 경우 32로 나눈 나머지를 새로운 원소로 한다.
void Plus(int k){
 
}
 
/// 집합에 모든 원소를 삭제하고 기존 원소에 k를 뺀 원소들로 채운다.
/// k를 뺀 원소가 음수인 경우 32로 나눈 나머지에 32를 더한 결과를 새로운 원소로 한다.
void Minus(int k){
 
}
 
/// k보다 작거나 같은 원소들 중 집합에 있는 원소를 모두 삭제한다.
void Clear(int k){
 
}
 
/// k보다 작거나 같은 원소들 중 집합에 없는 원소를 추가한다.
void Fill(int k){
 
}
 

 

[ main.cpp] 템플릿 코드]

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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/// === main.cpp ===
#include <stdio.h>
 
enum {INIT    = 0,
      FLIP    = 1,
      INSERT  = 2,
      ERASE   = 3,
      FIND    = 4,
      INVERSE = 5,
      PLUS    = 6,
      MINUS   = 7,
      CLEAR   = 8,
      FILL    = 9,
     };
static int N;
 
extern void Init();
extern void Flip();
extern void Insert(int k);
extern void Erase(int k);
extern int Find(int k);
extern void Inverse(int k);
extern void Plus(int k);
extern void Minus(int k);
extern void Clear(int k);
extern void Fill(int k);
 
 
static int run() {
    int cmd, k;
    int ans, result;
    Init();
    for(int i=0; i<N; ++i) {
        scanf("%d %d"&cmd, &k);
        k &= 31;
        switch(cmd) {
        case FLIP:
            Flip();
            break/// 1
        case INSERT:
            Insert(k);
            break/// 2
        case ERASE:
            Erase(k);
            break/// 3
        case FIND:
            result = Find(k);        /// 4
            scanf("%d"&ans);
            if(ans!=result) return 0;
            break;
        case INVERSE:
            Inverse(k);
            break/// 5
        case PLUS:
            Plus(k);
            break/// 6
        case MINUS:
            Minus(k);
            break/// 7
        case CLEAR:
            Clear(k);
            break/// 8
        case FILL:
            Fill(k);
            break/// 9
        }
    }
    return 1;
}
 
int main() {
    //freopen("input.txt", "r", stdin);
    int TC;
    scanf("%d"&TC);
    for(int tc=1; tc<=TC; ++tc) {
        scanf("%d"&N);
        if(run()) printf("Test %d : 100\n", tc);
        else printf("Test %d : 0\n", tc);
    }
    return 0;
}
 

 

 




첫 행에 테스트 케이스의 수 TC가 입력된다. (1 <= TC <= 50)
각 테스트 케이스의 첫 행에는 명령수 N이 입력된다. (1 <= N <= 500,000)
각 명령은 행 단위로 입력된다.



테스트 케이스를 모두 통과한 경우 100을 그렇지 않은 경우 0을 출력한다.


2
20
9 31
2 25
2 26
1 27
4 16 0
1 28
2 5
4 9 1
1 6
9 26
7 1
3 12
8 24
4 10 0
3 8
5 24
5 16
6 22
3 8
2 16
25
5 12
4 1 0
9 7
9 29
9 3
4 18 1
4 9 1
3 2
3 27
6 16
4 3 1
5 22
5 6
6 19
4 13 1
9 4
3 15
5 9
3 3
2 0
4 7 1
1 28
3 10
8 28
6 5
Test 1 : 100
Test 2 : 100


출처 : comkiwer




HancomEducation E-mail : hancomc@hotmail.com, comkiwer@naver.com Tel : 031-388-0999 FAX : 031-388-0996 정올소개 이용약관 개인정보처리방침
경기도 안양시 동안구 호계동 1065-10 협성골드프라자 601호, 경기도 안양시 동안구 평촌대로 109 협성골드프라자 601호
Copyright@2010-2015 jungol. All right reserved.