CP 꿀팁
CP는 무엇보다도 푸는 시간이 짧아야 한다. 쉬운 A B 문제들을 얼마나 빠르고 정확하게 푸느냐가 대회의 성적에 꽤나 많은 영향을 준다. 본 게시글에서는 이에 대한 꿀팁들을 정리해 놓으려고 한다.
bits/stdc++.h 헤더
가장 많이 알려져 있는 꿀팁이다. 모든 C++ 표준 라이브러리가 포함된 헤더이다. 표준 헤더가 아니기 때문에 GCC가 아닌 컴파일러로는 컴파일(인식)이 되지 않지만 백준, 코드포스, ACM-ICPC와 같이 GCC를 컴파일러로 사용하는 대회에서 유용하게 사용된다. 헤더 부분이 지저분해지는 것을 방지할 수 있고, 컴파일 시간은 오래 걸리지만 코딩 시간은 줄일 수 있다!
하지만, 필자는 다음의 이유로 사용하지 않기로 결정하였다.
- 굉장히 안 좋은 습관이 든다.
- 컴파일 시간의 차이가 결국 라이브러리 한 문장 추가하는 것과 차이가 없다는 의견
CLion에서 헤더 인식을 못함 도대체 외않되?
Debugging Header (dbg.h)
dbg.h
헤더를 이용한 디버깅을 이용한다. printf
를 이용해서도 할 수 있지만 우선 적어주기도 귀찮고(시간이 오래 걸리고), 온라인 저지에 제출할 때 지워줘야 하기 때문에 헤더를 이용하는 것을 추천한다. (또한, map
과 같은 STL을 사용할 때 반복문 없이 모든 요소들을 print해 준다)
dbg.h
헤더는 이 주소의 헤더를 사용하였다. (설명법도 적혀 있다)
사용법으로는 우선 헤더를 인식 가능한 위치에 저장해 두고, 다음의 코드를 위에 추가해 준다.1
2
3
4
5
간단한 코드인데, #ifdef __APPLE__
에서 컴파일러가 Mac OS 임을 검사한다. 본인의 컴퓨터인 맥북에서는 dbg.h
헤더를 include하여 사용하고, 그 외에는 무시한다. 추가로, 윈도우의 경우에는 #ifdef WIN32
나 #ifdef WIN64
를 사용하면 될 것이다. (확인해보지 않았음)
이후, dbg(변수);
를 해주면 console 창에 변수의 값과 자료형이 적힌다.
C++에서 string 입력 받기
공백이 포함된 한 줄 전체를 string
으로 받아올 때는 다음과 같이 getline
을 사용할 수 있다.1
2string str;
getline(cin, str);
그래프 그려주는 툴
https://csacademy.com/app/graph_editor/
입력 개수가 명시되지 않은 입력 받기
C++의 경우에는 while(cin << n)
으로 받을수 있으며, C의 경우에는 다음과 같이 받을 수 있다.1
2
3
4int n;
while(scanf("%d",&n) != EOF) {
// code
}
{ } 로 컨테이너 값 입력하기
make_pair
와 같은 함수를 사용하지 않고, 간단하게 { } 를 사용하여 값을 초기화해 줄 수 있다.1
2
3
4pair <int, int> p;
p = {3,4};
// this is same with
// p = make_pair(3,4);stack
, queue
를 제외한 컨테이너(pair
, vector
, deque
, set
, list
, array
, tuple
)에는 모두 적용 가능하다.
유용한 함수들
GCD
std::gcd(value1, value2)
: 최대공약수 빠르게 구하기 (유클리드 호제법 사용 안해도 됨)#include <numeric>
해주어야 한다.
특정 값으로 배열 초기화
memset(a, 2, sizeof(a))
: 배열 a를 2로 초기화 (for문 보다 빠를 수도 있다 - 컴파일러 따라 다름)#include <cstring>
해주어야 한다.
여러 값의 min
min({a, b, c, d, ...})
와 같이 쓰면, 여러 값들의 최소값을 한 번에 구할 수 있다.
push_back 대신 emplace_back
emplace_back()
이 push_back()
보다 빠르다고 한다. 사용법은 같다.