728x90
728x90
https://www.acmicpc.net/problem/11723
문제
비어있는 공집합 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을 출력한다. (1 ≤ x ≤ 20)
- 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 <bits/stdc++.h>
using namespace std;
vector <int> vset;
void add(int x) { //add
auto it = find(vset.begin(), vset.end(), x);
if (it == vset.end()) { //없는 경우
vset.push_back(x);
}
}
void remove(int x) { //remove
auto it = find(vset.begin(), vset.end(), x);
if (it != vset.end()) { //있는 경우
vset.erase(vset.begin()+(it - vset.begin()));
}
}
void check(int x) { //check
auto it = find(vset.begin(), vset.end(), x);
if (it == vset.end()) {
cout << 0 << '\n';
}
else {
cout << 1 << '\n';
}
}
void toggle(int x) { //toggle
auto it = find(vset.begin(), vset.end(), x);
if (it == vset.end()) { // 없는 경우
vset.push_back(x);
}
else { // 있는 경우
vset.erase(vset.begin() + (it - vset.begin()));
}
}
void all() { //all
for (int i = 1; i < 21; i++) {
auto it = find(vset.begin(), vset.end(), i);
if (it == vset.end()) {
vset.push_back(i);
}
}
}
void empty() { //empty
vset.clear();
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int cnt = 0;
cin >> cnt;
while (cnt--) {
string str;
int num;
cin >> str;
if (str == "all") {
all();
}
else if (str == "empty") {
empty();
}
else {
cin >> num;
if (str == "add") {
add(num);
}
else if (str == "check") {
check(num);
}
else if (str == "remove") {
remove(num);
}
else if (str == "toggle") {
toggle(num);
}
}
}
}
728x90
728x90
'Algorihtm > BOJ' 카테고리의 다른 글
C++ 백준 11659번: 구간 합 구하기 4 (0) | 2023.01.25 |
---|---|
C++ 백준 9095번: 1, 2, 3 더하기 (0) | 2023.01.24 |
C++ 백준 13904번: 과제 (0) | 2023.01.22 |
C++ 백준 9375번: 패션왕 신해빈 (0) | 2023.01.21 |
C++ 백준 5598번 : 카이사르 암호 (0) | 2023.01.20 |