본문 바로가기
Algorithm/BOJ

[BOJ]11723번: 집합 (c++)

by HBGB 2020. 5. 22.

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

 

11723번: 집합

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

www.acmicpc.net

 

#include <iostream>

using namespace std;

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

	const int MAX = 20;
	int M, S = 0;
	cin >> M;
	while (M--)
	{
		string cmd;
		int x;
		cin >> cmd;

		// x를 추가
		if (cmd == "add")
		{
			cin >> x;
			S |= (1 << --x);
		}
		// x를 제거
		else if (cmd == "remove")
		{
			cin >> x;
			S &= ~(1 << --x);
		}
		// x를 검사
		else if (cmd == "check")
		{
			cin >> x;
			cout << ((S & (1 << --x)) > 0) << '\n';
		}
		// x를 토글 (0을 1로, 1을 0으로)
		else if (cmd == "toggle")
		{
			cin >> x;
			S ^= (1 << --x);
		}
		// 전체 집합
		else if (cmd == "all")
		{
			S = (1 << MAX) - 1;
		}
		// 공집합
		else if (cmd == "empty")
		{
			S = 0;
		}
	}

	return 0;
}

 

비트마스크 연습용 문제!

 

 

TIP

이 문제의 경우는 check 명령어만 true/false를 출력하면 된다. 

따라서 아래 <틀린연산> 처럼 1을 x번 옮겨서 연산해도 AC는 나온다.

하지만 엄밀히 말하면 틀린연산. 

1의 자리를 버리게 된다 아깝잖아 ..

/* S에 x를 추가할 때 */

// 올바른 연산
S |= (1 << --x);

// 틀린 연산
S |= (1 << x);

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ]14391번: 종이 조각 (c++)  (0) 2020.05.22
[BOJ]1182번: 부분수열의 합 (c++)  (0) 2020.05.22
[BOJ]1248번: 맞춰봐 (c++)  (0) 2020.05.22
[BOJ]2529번: 부등호 (c++)  (0) 2020.05.21
[BOJ]15661번: 링크와 스타트 (c++)  (0) 2020.05.21

댓글