문제
비어있는 공집합 S가 주어졌을 때, 아래 연산을 수행하는 프로그램을 작성하시오.
- add x: S에 x를 추가한다. (1 ≤ x ≤ 20) S에 x가 이미 있는 경우에는 연산을 무시한다.
- remove x: S에서 x를 제거한다. (1 ≤ x ≤ 20) S에 x가 없는 경우에는 연산을 무시한다.
- check x: S에 x가 있으면 1을, 없으면 0을 출력한다.
- toggle x: S에 x가 있으면 x를 제거하고, 없으면 x를 추가한다. (1 ≤ x ≤ 20)
- all: S를 {1, 2, ..., 20} 으로 바꾼다.
- empty: S를 공집합으로 바꾼다.
입력
첫째 줄에 수행해야 하는 연산의 수 M (1 ≤ M ≤ 3,000,000)이 주어진다.
둘째 줄부터 M개의 줄에 수행해야 하는 연산이 한 줄에 하나씩 주어진다.
출력
check 연산이 주어질때마다, 결과를 출력한다.
코드
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n = 20;
int s = 0;
int m;
cin >> m;
char b[111];
int x;
while (m--) {
cin >> b;
if (!strcmp(b, "add")) {
cin >> x;
x--;
s = (s | (1 << x));
}
else if (!strcmp(b, "remove")) {
cin >> x;
x--;
s = (s &~ (1 << x));
}
else if (!strcmp(b, "check")) {
cin >> x;
x--;
int ans = (s & (1 << x));
if (ans) {
cout << 1 << '\n';
}
else {
cout << 0 << '\n';
}
}
else if (!strcmp(b, "toggle")) {
cin >> x;
x--;
s = (s ^ (1 << x));
}
else if (!strcmp(b, "all")) {
s = (s | (1 << n) - 1);
}
else if (!strcmp(b, "empty")) {
s = 0;
}
}
return 0;
}
메모
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
c++ 입출력 속도를 빠르게 하기위하여 사용
'algorithm' 카테고리의 다른 글
[백준/c++][11724] 연결 요소의 개수 (0) | 2019.10.10 |
---|---|
[백준/c++][1182] 부분수열의 합 (0) | 2019.10.04 |
[백준/c++][14501] 퇴사 (0) | 2019.10.03 |
[프로그래머스/c++] 모의고사 (0) | 2019.09.27 |
[프로그래머스/js]핸드폰 번호 가리기 (0) | 2019.09.27 |
댓글