백준 문제풀이

[백준/C++] 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 연산이 주어질때마다, 결과를 출력한다.

알고리즘 분류가 비트마스킹과 연관되어있어 비트마스킹을 함께 정리했는데,

 

비트마스크 란?

11723번 문제를 풀면서 나온 개념을 잠깐 정리해보고자 한다. Bitmask란 비트위에 마스크를 씌우는 방식을 통해서 어떤 위치에 집합의 원소가 존재하는지 아닌지, 추가하는 등의 행위를 말하며, 정�

runa-nam.tistory.com

사실상 비트마스크는 사용하지 않고, 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