출처 : https://www.acmicpc.net/problem/11723
집합
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞은 사람 | 정답 비율 |
---|---|---|---|---|---|
1.5 초 | 4 MB | 10297 | 2810 | 1922 | 26.851% |
문제
비어있는 공집합 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
연산이 주어질때마다, 결과를 출력한다.
예제 입력 1
26 add 1 add 2 check 1 check 2 check 3 remove 2 check 1 check 2 toggle 3 check 1 check 2 check 3 check 4 all check 10 check 20 toggle 10 remove 20 check 10 check 20 empty check 1 toggle 1 check 1 toggle 1 check 1
예제 출력 1
1 1 0 1 0 1 0 1 0 1 1 0 0 0 1 0
풀이
- 배열을 사용해서 빠르게 풀 수 있다.
- 풀이는 아래 소스코드를 보는 것이 간단.
- 입출력 함수를 느린 함수를 쓰면 시간 초과가 될 수 있다.
소스코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | // // main.cpp // algo // // Created by 임재곤 on 2018. 7. 28.. // Copyright © 2018년 gohn. All rights reserved. // #include <iostream> #include <vector> using namespace std; #define TOTAL 20 + 1 #pragma warning(disable : 4996) int main(int argc, const char * argv[]) { // insert code here... int M; cin >> M; vector<int> set_vec(TOTAL, 0); for (int m_idx = 0; m_idx < M; m_idx++) { char _string[5]; int _val; scanf("%s", &_string); // all 이 아니면 숫자 받기 if (_string[1] != 'l') scanf("%d", &_val); switch (_string[0]) { case 'a': // add if (_string[1] == 'd') { set_vec.at(_val) = 1; break; } // all if (_string[1] == 'l') { for (int vec_idx = 0; vec_idx < TOTAL; vec_idx++) set_vec.at(vec_idx) = 1; break; } break; // check case 'c': printf("%d\n", set_vec.at(_val)); break; // remove case 'r': set_vec.at(_val) = 0; break; // toggle case 't': set_vec.at(_val) ? set_vec.at(_val) = 0 : set_vec.at(_val) = 1; break; // empty case 'e': for (int vec_idx = 0; vec_idx < TOTAL; vec_idx++) set_vec.at(vec_idx) = 0; break; default: break; } } return 0; } | cs |