본문 바로가기

알고리즘/BOJ

11723번

11723번 - 집합


비트마스크를 공부하면서 기본적인 연습문제로 풀어보았다..


풀면서 발생했던 문제


1시간초과-> cin,cout 을 모두 scanf,printf 로 바꾸면서 수정.

2. 처음에 string쓰다보니까 cin, getline 썼을 때 공백으로 인한 문제점 -> char 로 바꾸고 모두 통일하면서 수정.

3.원소 1이 비트마스크 0번째 수, 원소 2가 비트마스크 1번째 수... 이런거 헷갈렸음.



S 집합에 p번째 원소 추가

S |= (1<<p);


S집합에 p번째 원소 제거

S &= ~(1<<p);


S집합에 p번째 원소 확인

if(S & (1<<p)) 

{     

원소 존재;

}

else

{    

원소 없음;

}


S집합에 p번째 원소 토글(꺼져있으면 켜고, 켜져있으면 끔)

S ^= (1<<p);


원소가 N개인 전체 집합 S

S = (1<<N) - 1;


공집합 S

S=0;


<정답 코드>


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
#include<iostream>
#include<string>
#include<string.h>
using namespace std;
 
int main()
{
    int M;
    scanf("%d"&M);
    int S = 0;
 
    while (M--)
    {
        char s[100];
        int x;
        scanf("%s", s);
 
        if (!strcmp(s, "add"))
        {
            scanf("%d"&x);
            S |= 1 << (x-1);
        }
        else if (!strcmp(s,"remove"))
        {
            scanf("%d"&x);
            S &= ~(1 << (x - 1));
        }
        else if (!strcmp(s,"check"))
        {
            scanf("%d"&x);
            if (S & (1 << (x - 1)))
            {
                cout << "1" << endl;
            }
            else
            {
                cout << "0" << endl;
            }
        }
        else if (!strcmp(s,"toggle"))
        {
            scanf("%d"&x);
            S ^= (1 << (x - 1));
        }
        else if (!strcmp(s, "all"))
        {
            S = (1 << 20- 1;
        }
        else if (!strcmp(s, "empty"))
        {
            S = 0;
        }
 
    }
 
    return 0;
}
cs


반응형

'알고리즘 > BOJ' 카테고리의 다른 글

11403번  (0) 2017.12.05
2252번  (0) 2017.12.05
1373번  (0) 2017.12.04
2745번  (0) 2017.12.04
11005번  (0) 2017.12.02