본문 바로가기
PS

백준 11723번 C++ 집합 정답률이 낮은 이유

by mtoc 2019. 9. 17.

집합


비어있는 공집합 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를 공집합으로 바꾼다. 





세 번이나 틀렸던 이유?


입출력 속도 때문이다.

이것 때문에 fill 함수 memset으로 바꾸고 printf를 puts로 바꾸는 등 가상한 노력을 했지만 아무 일도 일어나지 않았다.

도대체 맞은 사람들은 뭔 짓을 했길래 맞은 걸까? 하는 생각을 하며 검색해본 결과


ios_base::sync_with_stdio(0)


이것이 차이였다.

찾아보니 입출력 속도를 향상시켜주는 함수란다.

아무튼 저렇게 하고 나니 계속 시간 초과 떴었던 40퍼 구간을 가뿐히 통과했고 틀렸습니다 3개가 남았다.





A ? B : C

A가 참이면 B 실행, 거짓이면 C 실행하는 삼항 연산자

if~else문을 길게 늘여쓰지 않아도 되는 장점이 있다.





fill과 memset의 차이

https://www.acmicpc.net/board/view/23217 참고





코드

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
#include <iostream>
#include <cstring>
using namespace std;
bool checkNum[21];
int main() {
    ios_base::sync_with_stdio(0);//입출력 속도 향상
    cin.tie();
    int M;
    cin>>M;
    while(M>0) {
        int x;
        string cmd;
        cin>>cmd;
        if (cmd=="add") {
            cin>>x;
            checkNum[x]=true;
        } else if (cmd=="remove") {
            cin>>x;
            checkNum[x]=false;
        } else if (cmd=="check") {
            cin>>x;
            checkNum[x] ? (puts("1")) : (puts("0"));
        } else if (cmd=="toggle") {
            cin>>x;
            checkNum[x] ? (checkNum[x]=false) : (checkNum[x]=true);
        } else if (cmd=="all") {
            memset(checkNum, truesizeof(checkNum));
        } else {
            memset(checkNum, falsesizeof(checkNum));
        }
        M--;
    }
    return 0;
}
cs


'PS' 카테고리의 다른 글

백준 1904 C++ 타일  (0) 2019.12.08
백준 10819번 C++ 순열 활용 문제  (0) 2019.09.18
백준 1744번 C++ 수 묶기  (0) 2019.06.29
백준 1654번 C++ 랜선 자르기  (0) 2019.06.28
백준 2178번 C++ 미로 탐색  (0) 2019.06.26

댓글