Algorithm

[백준 11723] 집합

moguogu 2021. 7. 29. 14:41

집합

문제설명

image

첫 줄에 명령의 수를 입력 받고, 위의 사진대로 명령이 수행되도록 구현한다.


알고리즘

  1. 입력할 명령어의 수를 입력 받는다.
  2. 각 명령어 별로 확인을 하고 알맞은 수행을 한다.
  3. 시간 절약을 위해서 직접 값을 찾지 않고, 값의 범위가 1~20이므로 배열에 존재하면 1, 그렇지 않으면 0으로 표기하여 수행한다.

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;

int main(void)
{
    int N;
    cin >> N;
    int v[21] = { 0, };
    ios::sync_with_stdio(0);
    cin.tie(NULL);
    cout.tie(NULL);
    while (N)//회의실 정보 입력받기
    {
        string s;
        cin >> s;
        int num;
        if (s == "add")
        {
            cin >> num;
            if (v[num] == 0)//없으면 추가
                v[num] = 1;
        }
        if (s == "remove")
        {
            cin >> num;            
            if (v[num]==1)//있으면 지우기
                v[num] = 0;
        }
        if (s == "check")
        {
            cin >> num;

            if (v[num] == 1)//있으면 1출력
                cout << 1 << "\n";
            else //없으면 0출력
                cout << 0 << "\n";
        }
        if (s == "toggle")
        {
            cin >> num;
            if (v[num] == 1)//있으면 제거
                v[num] = 0;
            else //없으면 추가
                v[num] = 1;
        }
        if (s == "all")//1~20까지 전부1로
        {
            for (int i = 0; i < 21; i++)
                v[i] = 1;
        }
        if (s == "empty")//1~20까지 전부 0으로
        {
            for (int i = 0; i < 21; i++)
                v[i] = 0;
        }

        N--;
    }

    return 0;
}

고찰

이번 문제는 처음에 vector를 이용하고 find함수를 이용하여 값을 찾아서 만드는 문제인줄 알았다.
하지만 시간제약이 있고 값의 범위도 한정되어 있어서 그렇게 풀면 안된다.

시간 절약을 위해서 1~20까지의 배열을 만들고 그 값이 있으면 1로, 없으면 0으로 만든다.
index를 활용하여 빠르게 접근하여 시간을 줄이고, cin으로 입력 받을 때 또한 시간을 줄일 필요가 있었다.

'Algorithm' 카테고리의 다른 글

[백준 11399] ATM  (0) 2021.07.29
[백준 11726] 2xN 타일링  (0) 2021.07.29
[백준 1931] 회의실 배정  (0) 2021.07.29
[백준 1541] 잃어버린 괄호  (0) 2021.07.29
[백준 1181] 단어 정렬  (0) 2021.07.29