728x90
문제
비어있는 공집합 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을 출력한다. (1 ≤ x ≤ 20)
- toggle x: S에 x가 있으면 x를 제거하고, 없으면 x를 추가한다. (1 ≤ x ≤ 20)
- all: S를 {1, 2, ..., 20} 으로 바꾼다.
- empty: S를 공집합으로 바꾼다.
입력
첫째 줄에 수행해야 하는 연산의 수 M (1 ≤ M ≤ 3,000,000)이 주어진다.둘째 줄부터 M개의 줄에 수행해야 하는 연산이 한 줄에 하나씩 주어진다.
출력
check 연산이 주어질때마다, 결과를 출력한다.
C++의 set 컨테이너를 사용하면 쉽게 해결할 수 있다. set 컨테이너는 정렬된 데이터의 집합을 관리하기 위한 컨테이너이다. 중복을 허용하지 않고, 자동으로 정렬된 상태를 유지하며, 이진 검색 트리 또는 해시 기반 구조를 내부적으로 사용한다.
주요 함수는 다음과 같다.
삽입/삭제 | |
insert(value) | 값을 삽입한다. 값이 이미 존재하면 아무 작업도 하지 않는다. |
erase(value) | 값을 삭제한다. 값이 존재하지 않으면 아무 작업도 하지 않는다. |
clear() | 모든 요소를 삭제한다. |
탐색 | |
find(value) | 값이 있는 반복자(iterator)를 반환한다. 없으면 end()를 반환한다. |
count(value) | 값이 존재하면 1, 없으면 0을 반환한다. |
lower_bound(value) | value 이상인 첫 번째 값의 반복자를 반환한다. |
upper_bound(value) | value 초과인 첫 번째 값의 반복자를 반환한다. |
상태 | |
empty() | 컨테이너가 비어있으면 1, 그렇지 않으면 0을 반환한다. |
size() | 컨테이너의 요소의 개수를 반환한다. |
다음으로, 이 문제는 명령어에 따라 동작하므로 switch문을 사용하는 것이 적합하다. 하지만, C++에서는 switch문의 expression으로 정수 상수만을 허용한다. 따라서 입력받은 명령어(문자열)을 정수의 형태로 변환하여 expression으로 사용해야 하는데, 이를 위해 map을 사용할 수 있다.
map<string, int> command_map = {
{"add", 0},
{"remove", 1},
{"check", 2},
{"toggle", 3},
{"all", 4},
{"empty", 5}};
문자열과 정수를 키-값 매핑하여 정의하면 switch문에서도 이를 활용할 수 있다.
#include <iostream>
#include <set>
#include <map>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
map<string, int> command_map = {
{"add", 0},
{"remove", 1},
{"check", 2},
{"toggle", 3},
{"all", 4},
{"empty", 5}};
set<int> s;
int N;
cin >> N;
string input;
int x;
for (int i = 0; i < N; i++)
{
cin >> input;
int cmd = command_map[input];
switch (cmd)
{
case 0:
cin >> x;
s.insert(x);
break;
case 1:
cin >> x;
s.erase(x);
break;
case 2:
cin >> x;
cout << s.count(x) << '\n';
break;
case 3:
cin >> x;
if (s.count(x))
s.erase(x);
else
s.insert(x);
break;
case 4:
s = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
break;
case 5:
s.clear();
break;
default:
break;
}
}
return 0;
}
all과 empty는 x를 입력받지 않으므로 이에 대한 처리를 해주어야 한다.
728x90
'Baekjoon' 카테고리의 다른 글
[Baekjoon] 1003: 피보나치 함수 - (C3, S3) DP, std::pair (0) | 2025.01.06 |
---|---|
[Baekjoon] 9095: 1, 2, 3 더하기 - (C3, S3) DP (0) | 2025.01.06 |
[Baekjoon] 1927: 최소 힙 - (C3, S2) std::priority_cueue, 입출력 최적화 (0) | 2025.01.04 |
[Baekjoon] 11866: 요세푸스 문제 0 - (C2, S4) std::vector (0) | 2025.01.03 |
[Baekjoon] 10814: 나이순 정렬 - (C2, S5) std::stable_sort (0) | 2025.01.02 |