[백준 c++] 11723 집합

jw·2022년 10월 24일
0

백준

목록 보기
56/141
post-thumbnail

문제 설명

비어있는 공집합 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 연산이 주어질때마다, 결과를 출력한다.

아이디어

간단하다고 생각했는데 시간초과 문제가 있었다.
비트마스킹, 배열 이것저것 해봤는데 그래도 안됐다..ㅜ
찾아보니까 입출력 속도가 실행시간 대부분을 차지한다고 해서 입출력에서 시간을 줄였더니 정답처리됐다.

기존에는 밑에 코드처럼 입력은 cin으로 string 전체를 받은 후에 연산을 진행했는데

string s;
cin>>s;
if(s=="add") 
else if(s=="remove")

cin보다 속도가 빠른 scanf를 사용하고 문자열 전체를 검사하지않고 앞에 한 두개만 검사해서 속도를 높였다.

char s[11];
scanf(" %s %d", &s, &x);
if (s[0] == 'a' && s[1] == 'd')
else if (s[0]=='r')

전체 코드

#include <iostream>
using namespace std;
int n, x, a[21];
char s[11];
int main()
{
    cin >> n;
    while (n--)
    {
        scanf(" %s %d", &s, &x);

        if (s[0] == 'a' && s[1] == 'd')
            a[x] = 1;

        else if (s[0] == 'r')
            a[x] = 0;

        else if (s[0] == 'c')
        {
            if (a[x])
                cout << 1 << "\n";
            else
                cout << 0 << "\n";
        }

        else if (s[0] == 't')
        {
            if (a[x])
                a[x] = 0;
            else
                a[x] = 1;
        }

        else if (s[0] == 'a' && s[1] == 'l')
        {
            for (int i = 0; i < 21; i++)
                a[i] = 1;
        }

        else
        {
            for (int i = 0; i < 21; i++)
                a[i] = 0;
        }
    }
}
profile
다시태어나고싶어요

0개의 댓글