www.acmicpc.net/problem/11723

 

11723번: 집합

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

www.acmicpc.net

#include <iostream>
#include <string>
#include <set>
using namespace std;

int m;
string line;
int value;
bool ans[21];

int main(void)
{
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> m;
  while(m--)
  {
    cin >> line;
    switch(line[1])
    {
      // add, 해당 인덱스 무조건 true
      case 'd' :
        cin >> value;
        ans[value] = true;
        break;
      // remove, 해당 인덱스 무조건 false
      case 'e' :
        cin >> value;
        ans[value] = false;
        break;
      // check, 해당 인덱스 값 출력
      case 'h' :
        cin >> value;
        if(ans[value]) cout << 1 << '\n';
        else cout << 0 << '\n';
        break;
      // toggle, 해당 인덱스값만 뒤집어줌
      case 'o' :
        cin >> value;
        ans[value] = !ans[value];
        break;
      // all, 전부 채워줌
      case 'l' :
        for(int i = 1 ; i < 21 ; i++)
        {
          ans[i] = true;
        }
        break;
      // empty, 전부 비워줌
      case 'm' :
        for(int i = 1 ; i < 21 ; i++)
        {
          ans[i] = false;
        }
        break;
     }
  }
}

 

[Try]

1. 문제제목의 집합을 보고 단순무식하게 set 자료구조를 생각했는데 시간초과가 났다.

2. 생각해보니 그냥 배열로 사용해서 인덱스에 바로 접근해도 될 것 같은데 왜 set에 있는 find 로 매번 찾아준거지...

 

[Point]

1. 채점시간이 파이썬마냥 오래걸려서 좀 쫄렸다

2. 굳이 배열도 할 필요 없이 정말 하나의 수에 있는 비트를 활용하여 마스킹 하는 방법이 정석인 것 같다!

3. 문자열 비교 strcmp, 이 경우 c_str 로 만들어줘야 할 것 같다.

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

[백준] 11726.cpp : 2 x n 타일링  (0) 2020.05.26
[백준] 4948.cpp : 베르트랑 공준  (0) 2020.05.26
[백준] 1929.cpp : 소수 구하기  (0) 2020.05.25
[백준] 18111.cpp : 마인크래프트  (0) 2020.05.23
[백준] 2805.cpp : 나무 자르기  (0) 2020.05.21

+ Recent posts