문제
비어있는 공집합 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 연산이 주어질때마다, 결과를 출력한다.
알고리즘 분류가 비트마스킹과 연관되어있어 비트마스킹을 함께 정리했는데,
사실상 비트마스크는 사용하지 않고, boolean형 배열을 사용해서 문제를 풀었다. 문제 자체의 난도는 높지 않은듯.
#include <cstdio>
#include <iostream>
#include <string>
using namespace std;
int num;
bool a[21];
void func(string s, int n)
{
if (s == "add")
{
if (a[n] == false)
a[n] = true;
}
else if (s == "remove")
{
if (a[n] == true)
a[n] = false;
}
else if (s == "check")
{
if (a[n] == true)
printf("1\n");
else
printf("0\n");
}
else if (s == "toggle")
{
if (a[n] == true)
a[n] = false;
else
a[n] = true;
}
else if (s == "all")
{
for (int i = 1; i <= 20; i++)
{
a[i] = true;
}
}
else if (s == "empty")
{
for (int i = 1; i <= 20; i++)
{
a[i] = false;
}
}
}
int main(void)
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> num;
for (int i = 1; i <= 20; i++)
{
a[i] = false;
}
for (int i = 0; i < num; i++)
{
string s;
int n;
cin >> s;
if (s == "empty" || s == "all")
func(s, 0);
else
{
cin >> n;
func(s, n);
}
}
}
'백준 문제풀이' 카테고리의 다른 글
[백준/C++] 1927 최소 힙 (0) | 2020.08.29 |
---|---|
[백준/C++] 11279 최대 힙 (0) | 2020.08.28 |
비트마스크 란? (0) | 2020.08.28 |
[백준/C++] 18870 좌표압축 (0) | 2020.08.28 |
좌표 압축 알고리즘 이란? (0) | 2020.08.28 |