본문 바로가기
algorithm

[백준/c++][11723] 집합

by blogsy 2019. 10. 4.

문제

 

비어있는 공집합 S가 주어졌을 때, 아래 연산을 수행하는 프로그램을 작성하시오.

  • add x: S에 x를 추가한다. (1 ≤ x ≤ 20) S에 x가 이미 있는 경우에는 연산을 무시한다.
  • remove x: S에서 x를 제거한다. (1 ≤ x ≤ 20) S에 x가 없는 경우에는 연산을 무시한다.
  • check x: S에 x가 있으면 1을, 없으면 0을 출력한다.
  • toggle x: S에 x가 있으면 x를 제거하고, 없으면 x를 추가한다. (1 ≤ x ≤ 20)
  • all: S를 {1, 2, ..., 20} 으로 바꾼다.
  • empty: S를 공집합으로 바꾼다. 

 

입력

 

첫째 줄에 수행해야 하는 연산의 수 M (1 ≤ M ≤ 3,000,000)이 주어진다.

둘째 줄부터 M개의 줄에 수행해야 하는 연산이 한 줄에 하나씩 주어진다.

 

출력

 

check 연산이 주어질때마다, 결과를 출력한다.

 

코드

 

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

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

	int n = 20;
	int s = 0;
	int m;
	cin >> m;
	char b[111];

	int x;
	while (m--) {
		cin >> b;
		if (!strcmp(b, "add")) {
			cin >> x;
			x--;
			s = (s | (1 << x));
		}
		else if (!strcmp(b, "remove")) {
			cin >> x;
			x--;
			s = (s &~ (1 << x));
		}
		else if (!strcmp(b, "check")) {
			cin >> x;
			x--;
			int ans = (s & (1 << x));
			if (ans) {
				cout << 1 << '\n';
			}
			else {
				cout << 0 << '\n';
			}
		}
		else if (!strcmp(b, "toggle")) {
			cin >> x;
			x--;
			s = (s ^ (1 << x));
		}
		else if (!strcmp(b, "all")) {
			s = (s | (1 << n) - 1);
		}
		else if (!strcmp(b, "empty")) {
			s = 0;
		}
	}
	return 0;
}

 

메모

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

c++ 입출력 속도를 빠르게 하기위하여 사용

댓글