서두르지 말고 쉬지 말자

백준 11723번 집합(C++) 본문

코딩 공부/Baekjoon Problem Solving

백준 11723번 집합(C++)

philos 2025. 4. 15. 16:37

solved.ac 티어 : 실버 5

문제 유형 : 비트마스크

문제 해결 방안 : 시간이 매우 적게 주어지므로(1.5초) 비트마스크를 이용해 풀어야 한다. 시간을 단축하기 위해 코드 2개를 삽입했다.

 

문제 해결 소감 : 비트마스크가 뭔지 몰라서 공부하고  풀었다. 새로운 유요한 개념을 알게 됐다. C++에서 시간 단축을 위한 코드를 알게 되었다.

 

#include <iostream>
std::string cmd;
int x = 0;
int M = 0;
unsigned int bit = 0;
int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(NULL); // 시간 단축용 (stdio와 동기화 끊기& 자동 flush 안하기)

    std::cin >> M;
    for (int i = 0; i < M; i++)
    {
        std::cin >> cmd;

        if (cmd == "add") // 집합에 x값 추가 이미 있으면 무시
        {
            std::cin >> x;
            bit |= (1 << (x - 1)); // 정수 1을 왼쪽으로 x비트 만큼 밀고, bit OR 연산 실행 -> x자리 비트 1로 변경
        }
        else if (cmd == "remove") // 집합에 들어있는 x값 제거 이미 없으면 무시
        {
            std::cin >> x;
            bit &= ~(1 << (x - 1)); // 정수 1을 왼쪽으로 x비트 만큼 밀고, bit 연산 실행
        }
        else if (cmd == "check") // 집합에 x값이 있으면 1 아니면 0 출력
        {
            std::cin >> x;
            if (bit & (1 << (x - 1))) // x가 있으면 해당 위치 비트가 살아남아서 0이상 아니면 0
            {
                std::cout << "1\n";
            }
            else
            {
                std::cout << "0\n";
            }
        }
        else if (cmd == "toggle") // S에 x가 있으면 제거, 없으면 추가
        {
            std::cin >> x;
            if (bit & (1 << (x - 1))) // x가 있다면(x 위치 비트가 1이라면)
            {
                bit &= ~(1 << (x - 1)); // x 제거
            }
            else // x가 없다면
            {
                bit |= (1 << (x - 1)); // x 추가(x 위치 비트 1로 변경)
            }
        }
        else if (cmd == "all")
        {
            bit |= ~0; // 비트 다 0인걸 1로 반전 후 OR연산 -> 전부 다 1로 만듬
        }
        else if (cmd == "empty")
        {
            bit = 0; // 0 대입 -> 비트 다 0
        }
    }
}
반응형