알고리즘/백준
[백준/c++] 11723번: 집합
녕이
2022. 8. 4. 23:08
728x90
https://www.acmicpc.net/problem/11723
11723번: 집합
첫째 줄에 수행해야 하는 연산의 수 M (1 ≤ M ≤ 3,000,000)이 주어진다. 둘째 줄부터 M개의 줄에 수행해야 하는 연산이 한 줄에 하나씩 주어진다.
www.acmicpc.net
[시간 초과 - set 사용]
사실 시간초과 나올 줄 알았다.. 후^^
#include <iostream>
#include <algorithm>
#include <set>
using namespace std;
int main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int m;
set<int> s;
cin >> m;
while(m--){
string str;
int n;
cin >> str;
if(str == "add"){
cin >> n;
s.insert(n);
}else if(str == "remove"){
cin >> n;
s.erase(n);
}else if(str == "check"){
cin >> n;
if(s.count(n) != 0) cout << 1 << '\n';
else cout << 0 << '\n';
}else if(str == "toggle"){
cin >> n;
if(s.count(n) != 0) s.erase(n);
else s.insert(n);
}else if(str == "all"){
s.clear();
for(int i=1; i<=20; i++) s.insert(i);
}else if(str == "empty"){
s.clear();
}
}
return 0;
}
[비트 마스킹 코드]
다른 사람의 코드를 보고 알 수 있었다
(1<<n)은 n번째 자릿수라고 보고
S 집합에 i라는 수가 들어오면 i번째가 1이 된다. 즉, i번째 수가 1이 되면 S 집합에 i가 들어온 것으로 친다.
ADD: n번째 자릿수를 1로 바꾼다
bit = bit | (1<<n)
//bit = 0, n = 2
//bit = 0 | 100 = 100
//bit = 100, n = 3
//bit = 100 | 1000 = 1100
REMOVE: n번째 자릿수를 0으로 바꾼다
bit = bit & ~(1<<n)
//bit = 1100, n = 3
//bit = 1100 & 0111 = 0100
CHECK: n번째 자릿수가 있는지(1)/없는지(0)
bit = bit & (1<<n)
//bit = 0100, n = 4
//bit = 0100 & 10000 = 0
//bit = 0100, n = 2
//bit = 0100 & 100 = 1
TOGGLE: n번째 자릿수 flip (1->0, 0->1)
bit = bit ^ (1<<n)
//bit = 0100, n = 4
//bit = 00100 ^ 10000 = 10100
ALL: 모두 1로 변경 (1~20이므로 21에서 1 빼면 20개가 모두 1이 된다)
bit = (1<<21) - 1
//bit = 1000
//bit = 1000 - 1 = 111
EMPTY: 초기화
bit = 0
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int m;
cin >> m;
string str;
int n, bit = 0;
while(m--){
cin >> str;
if(str == "add"){
cin >> n;
bit |= (1<<n); //n번째 자리수를 1로 바꾼다
//bit = 100
}else if(str == "remove"){
cin >> n;
bit &= ~(1<<n);
//bit = 100 & 001 = 000 //해당 수 없애기
}else if(str == "check"){
cin >> n;
if(bit & (1<<n)) cout << 1 << '\n';
else cout << 0 << '\n';
//bit = 100 & 100 = 1
//bit = 100 & 101 = 0
}else if(str == "toggle"){
cin >> n;
bit ^= (1<<n);
//bit = 100 ^ 100 = 0 //XOR는 다르면 1
}else if(str == "all"){
bit = (1<<21) - 1;
//1000 - 1 = 111
}else if(str == "empty"){
bit = 0;
//초기화
}
}
return 0;
}
728x90