거의 알고리즘 일기장

백준 11723번 _ 집합 본문

알고리즘 문제풀이

백준 11723번 _ 집합

건우권 2020. 5. 5. 21:42

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

 

11723번: 집합

첫째 줄에 수행해야 하는 연산의 수 M (1 ≤ M ≤ 3,000,000)이 주어진다. 둘째 줄부터 M개의 줄에 수행해야 하는 연산이 한 줄에 하나씩 주어진다.

www.acmicpc.net

풀이방법

비트연산만 할줄안다면 풀수있다.

void add(int x)
{
	S |= (1 << x);
}

void remove(int x)
{
	S &= ~(1 << x);
}

void check(int x)
{
	if (S & (1 << x))
		cout << 1 << '\n';
	else
		cout << 0 << '\n';
}

void toggle(int x)
{
	S ^= (1 << x);
}

void all()
{
	S = ((1 << 21) - (1 << 0));
}

void empty()
{
	S = 0;
}

전체코드

#include <iostream>
#include <bitset>

using namespace std;

unsigned int S;
int M;

void add(int x)
{
	S |= (1 << x);
}

void remove(int x)
{
	S &= ~(1 << x);
}

void check(int x)
{
	if (S & (1 << x))
		cout << 1 << '\n';
	else
		cout << 0 << '\n';
}

void toggle(int x)
{
	S ^= (1 << x);
}

void all()
{
	S = ((1 << 21) - (1 << 0));
}

void empty()
{
	S = 0;
}

void Run(string order, int x)
{
	//두번째 글자가 겹치는게 없길래 그걸로 switch문 함
	switch (order[1])
	{
	case 'd':
		add(x);
		break;
	case 'e':
		remove(x);
		break;
	case 'h':
		check(x);
		break;
	case 'o':
		toggle(x);
		break;
	case 'l':
		all();
		break;
	case 'm':
		empty();
		break;
	}
}

int main()
{
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);
	cin >> M;

	string order;
	int x = 0;
	for (int i = 0; i < M; i++)
	{
		cin >> order;

		if (!(order == "all"  ||  order == "empty"))
			cin >> x;

		Run(order, x);
	}
}

후기

mcu다룰때 죽어라 한게 비트연산이었는데 그거 1년 안했다고 푸는데 가물가물해서 인터넷 보면서 풀었다.

어마어마한 빡대가리다. 오늘도 나에게 감탄했다.

반응형

'알고리즘 문제풀이' 카테고리의 다른 글

codeforces_ 492B _ B. Vanya and Lanterns  (0) 2020.05.06
백준 2098번 _ 외판원 순회  (0) 2020.05.06
백준 10942번 _ 팰린드롬?  (0) 2020.05.05
백준 7579번 _ 앱  (0) 2020.05.05
백준 1520번 _ 내리막 길  (0) 2020.05.04
Comments