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 |
반응형