본문 바로가기
[알고리즘 + 자료구조]/[백준]

[BaekJoon/백준] 11723번 C++

by Hevton 2021. 5. 9.
반응형

마지막 포스팅이 한달전이네

그 한달이 어떻게 지나갔는지도 모르겠다. 죽을맛.

 

그래도 알고리즘은 놓치면 큰일나지~

 

오랜만이여서 그런가..>?

원래도 못했지만 더 못해짐

 

집합 구현 문제인데 당연히 set으로 엄청나게 시도했으나 실패..

시간초과만 오지게 맞았당

#include <iostream>
#include <set>

using namespace std;
int M; // 수행 연산 수
string command; // command
int num;

int main() {

    ios::sync_with_stdio();
    cin.tie(NULL);

    set<int> s;
    cin >> M;

    while(M--) {
        cin >> command;

        if(command == "add") {
            cin >> num;
            s.insert(num);
        } else if(command == "remove") {
            cin >> num;
            s.erase(s.find(num));
        } else if(command == "check") {
            cin >> num;
            if(s.find(num) != s.end()) // 못찾을 경우 s.end()와 같은 값 리턴
                cout <<("1\n");
            else
                cout <<("0\n");

        } else if(command == "toggle") {
            set<int>::iterator it;
            cin >> num;
            if((it = s.find(num))!= s.end()) // 못찾을 경우 s.end()와 같은 값 리턴
                s.erase(it);
            else
                s.insert(num);
        } else if(command == "all") {
            s.clear();
            for(int i = 1; i <= 20; i++)
                s.insert(i);
        } else if(command == "empty") {
            s.clear();
        }


    }
}

 

 

다른분들 풀이 참고했음 ㅎㅎ

수의 범위가 적다 보니 비트마스킹 또는 간단한 배열로도 구현이 가능한 문제였다고 한다..! 난 모름

현재 너무 피곤하기에.. 라는 핑계로 비트마스킹은 다음에 보는거로 하고..

배열로 구현해봤다.

#include <iostream>

using namespace std;

bool range[21]; // 1 ~ 20 사용 위해
int M, num;
string command;

using namespace std;
int main() {
    
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    
    cin >> M;
    
        while(M--) {
            cin >> command;
    
            if(command == "add") {
                cin >> num;
                range[num] = true;
            } else if(command == "remove") {
                cin >> num;
                range[num] = false;
            } else if(command == "check") {
                cin >> num;
                if(range[num])
                    cout << "1\n";
                else
                    cout << "0\n";
            } else if(command == "toggle") {
                cin >> num;
                range[num] = !range[num];
            } else if(command == "all") {
                for(int i = 1 ; i <= 20; i++)
                memset(range, 1, sizeof(range));
            } else if(command == "empty") {
                memset(range, 0, sizeof(range));
            }
    
    
        }

}

참고로 memset 을 정수값을 초기화할 때 쓰는 분들도 간혹 있는 것 같은데

memset은 바이트 단위로 초기화하기 때문에 조심해야한다.

 

그래서 그냥 0으로 초기화 할때만 쓰던가 해야하고.. 이외의 경우 fill()을 쓰는걸 추천한다

어쩄든 여기서는 bool 배열이여서 1로 해도 상관없다. 

 

이왕이면 0과 NULL일때는 memset, 이외의 값일 경우 fill()을 추천..

속도는 memset이 더 빠르기에.

반응형

'[알고리즘 + 자료구조] > [백준]' 카테고리의 다른 글

[BaekJoon/백준] 11726번 C++  (0) 2021.05.15
[BaekJoon/백준] 11724번 C++  (0) 2021.05.09
[BaekJoon/백준] 11279번 C++  (0) 2021.04.06
[BaekJoon/백준] 9095번 C++  (0) 2021.04.06
[BaekJoon/백준] 7662번 C++  (0) 2021.04.05