코딩 테스트 준비! (백준)/브루트포스

[브루트포스] 백준 11723번 집합(C++)

lee-soo 2025. 4. 15. 12:29

 

https://www.acmicpc.net/problem/11723.

 

해당 문제는, 단순히 연산을 진행해주는 문제로 정말 쉽다

 

또한 단순히 출력을 존재하는가? 아닌가?로만 하기 때문에

숫자의 유무를 확인하는 배열을 정의 후, true false로 해주면 정말 쉬울 것 같다

 

n은 1부터 20까지밖에 없으니, 각 배열에 숫자를 저장하는 것이 아닌

indexing을 통해서 찾아갈 수 있게 배열의 번호를 따라 찾아가는 것이 좋을 것 같다

 

예를들어 1이라는 숫자가 들어오면

아마 이런 류의 문제를 풀어보지 않은 사람이라면 보통

 

arr[i] = 1 이런식으로 몇번째 인덱스에 넣은 후, 그 수를 찾아 돌아다닐 것이다.

 

하지만, 이러한 방법은 굉장히 비효율 적이다. 왜냐면 찾기위해 최악의 경우 20번까지 i를 찾아 돌아다닐 수 있기 때문이다.

 

그렇기 때문에 1이 들어온 경우

arr[1] = true로 해주는 형식이 굉장히 간단하다

 

이렇게되면 숫자를 찾을땐 단순히 1번째 인덱싱을 통해 찾아가면 되며, 복잡하게 배열을 나열할 필요도 없다

 

i가 들어오게 될 경우 arr[i]를 true로 바꿔주면 되는 것이다.

#include <iostream>
#include <cstring>

using namespace std;
bool set[21] = {0};
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    int n;
    cin >> n;
    while (n--)
    {
        string s;
        cin >> s;
        if (s == "add")
        {
            int x;
            cin >> x;
            set[x] = true;
        }
        else if (s == "remove")
        {
            int x;
            cin >> x;
            set[x] = false;
        }
        else if (s == "check")
        {
            int x;
            cin >> x;
            if (set[x])
                cout << 1;
            else
                cout << 0;
            cout << "\n";
        }
        else if (s == "toggle")
        {
            int x;
            cin >> x;
            if (set[x])
                set[x] = false;
            else
                set[x] = true;
        }
        else if (s == "all")
        {
            for (int i = 1; i <= 20; i++)
                set[i] = true;
        }
        else if (s == "empty")
        {
            for (int i = 1; i <= 20; i++)
                set[i] = false;
        }
    }
}

단 입출력시 n이 최대 3백만까지 주어지기 때문에, 

  ios::sync_with_stdio(false);
    cin.tie(NULL);
stdio와의 동기화를 끊어주며, cin과 cout의 연결을 끊어주는 함수를 사용한다.
 
 

이건 정말쉬움