11723번. 집합

phoenixKim·2022년 7월 23일
0

백준 알고리즘

목록 보기
43/174

코드

-> 시간초과 뜸.

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

// 이 문제를 왜 비트 연산자로 풀려고 했냐면?
// toggle , 반전을 한다던지
// 집합 처리를 한다던지
// 기존의 값을 제거한다던지
// => 처음에는 map에다가 넣어서 진행해볼까?
// 했는데, map에 넣더라도 , 이미 있는 키값에 대해서 
// 값 변경은 못하므로 안됨.

// 그렇다고 벡터로 하기에는 탐색 시간치 초과할 듯함.

// =====================================//

// 결론 => 시간을 빠르게 처리할 수 있는 비트 연산을 해야겠다는 
// 생각을 하게됨.

int main()
{
	int num;
	cin >> num;
	int data = 0;

	for (int i = 0; i < num; ++i)
	{
		//string s;
		char s[11];
		int n;
		scanf(" %s %d", &s, &n);
		//cin >> s >> n;
		
		// s에 all이 들어가면,, n에는 값이 안들어가는데,,
		// 그 뒤를 비워야 함.
		//if(s == "all" || s == "empty")
		//	cin.clear();

		//if (s == "add")
		if(s[0] == 'a' && s[1] == 'd')
		{
			// 이미 값이 있다면 연산을 무시해야 함.

			//if ( ( data & (1 << n) ) == 0)
				data |= (1 << n);


		}
		//else if (s == "remove")
		else if(s[0] == 'r')
		{
			// 해당 인덱스에서 1을 제거하자.
			// 이미 없다면 연산을 무시함.
			//if ( ( data & (1 << n) ) != 0)
			{
				//data -= (1 << n);				
				data &= ~(1 << n);
			}


		}
		//else if (s == "check")
		else if(s[0] =='c')
		{
			//int nnn = (data & (1 << n));
			// 해당 인덱스에 1이 위치해 있는지를 확인하자.
			// 0723 주의할 점 : 인덱스에 값이 있음을 확인할 때
			// 1이 나옴, 즉 true , 1이 true 라는 생각을 하면 
			// 안됨! 
			if ( ( data & (1 << n) ) == 0)
			{
				cout << 0 << endl;
			}
			else
				cout << 1 << endl;

		}
		//else if (s == "toggle")
		else if(s[0] == 't')
		{
			// 값이 있으면 제거하고 없으면 , 추가하자.
			data ^= (1 << n);
			//if ( ( data & (1 << n) ))
			//{
			//	data -= (1 << n);
			//
			//}
			//else
			//{
			//	data |= (1 << n);
			//}
		}
		//else if (s == "all")
		else if(s[0] == 'a' && s[1] == 'l')
		{
			// 모든 비트를 킴.
			data = (1 << 21) - 1;
		}
		//else if (s == "empty")
		else
		{
			// 공집합 00000
			data = 0;
		}
		
	}


}
profile
🔥🔥🔥

0개의 댓글

관련 채용 정보