집합
비어있는 공집합 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, true, sizeof(checkNum)); } else { memset(checkNum, false, sizeof(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 |
댓글