본문 바로가기

개발/백준

[백준] 11723번. 집합 (C++)

문제

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

 

주의사항

아래 코드는 C++에서 입출력 성능을 최적화하기 위한 코드로

추가해주지 않으면 시간초과 난다!

ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);

 

풀이

비트 마스크 써야하는 문제다

그냥 냅다 배열로 풀었더니 시간초과가 났다ㅎㅎ

 

<비트 연산>

AND & 비트 둘 다 1이여야만 1
OR | 비트 하나라도 1이면 1
XOR ^ 비트가 서로 다르면 1, 같으면 0
SHIFT <<,>> 비트를 좌우로 한칸씩 이동
NOT ~ 비트 반전

 

<구현>

ALL bit = (1 << 21) - 1; 1<<21은 1000...0000으로 1이 21번째 위치로 이동한 것이다.
여기서 1을 빼주면 모든 21 하위 비트가 1이 된다.
EMPTY bit=0;  bit가 0이되면 초기화!
ADD bit |= (1 << num);  
REMOVE bit &= ~(1 << num);  
CHECK bit & (1 << num) num번째가 1이라면 1을 반환할 것이다!
TOGGLE bit ^= (1 << num);  

 

#include <iostream>
#include <vector>
using namespace std;

int main()
{
	//input,output속도 향상
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);


	//VARIABLES
	long long n; cin >> n;
	int bit = 0;
	int num;
	string comd;


	for (long long i = 0; i < n; i++)
	{
		cin >> comd;
		if (comd == "all") 
		{ 
			bit = (1 << 21) - 1;
			continue; 
		}
		else if (comd == "empty") 
		{ 
			bit = 0;
			continue; 
		}


		cin >> num;
		if (comd == "add") 
		{
			bit |= (1 << num);
		}
		else if (comd == "remove") 
		{
			bit &= ~(1 << num);
		}
		else if (comd == "check") 
		{
			if (bit & (1 << num)) { cout << "1\n"; }
			else { cout << "0\n"; }
		}
		else if (comd == "toggle") 
		{
			bit ^= (1 << num);
		}
	}
}