PS를 함에 있어 후술할 몇몇 트릭들이 문제를 더 효율적으로 풀도록 도움을 줄 수도 있다.
그러나 일부 기법들은 근본적으로 별로 좋지 않은 방법임을 항상 염두에 두어야 한다.
따라서 현명하게 상황에 맞춰서 적절히 취사선택해서 사용하는 것을 권장한다.
#define all(x) begin(x), end(x)
: 컨테이너의 모든 원소에 대한 매크로
#define int long long
: int 범위 초과 시, 일괄 수정이 필요할 때 (signed main()
)
#define rep(i, a, b) for (int i = (a); i < (b); ++i)
: 반복문 매크로
#define debug(x) cout << #x << " is " << x << '\n'
: 디버깅 (문자열화 연산자 #
)
lower_bound(all(v), x)
: x
보다 크거나 같은 첫번째 원소의 위치
upper_bound(all(v), x)
: x
보다 큰 첫번째 원소의 위치
next_permutation(all(v))
: 사전순으로 다음에 위치한 순열
prev_permutation(all(v))
: 사전순으로 이전에 위치한 순열
iota(all(v), x)
: 컨테이너 첫 번째를 x
로 하고, ++x
를 하며 채움
for(auto& x : v)
: 범위 기반 for 루프 (원본)
for(auto x : v)
: 범위 기반 for 루프 (사본)
pair<int, int> p = {1, 2}
: 중괄호 초기화 (=make_pair(1, 2)
)
auto [a, b] = p
: 구조적 바인딩 (= auto a = p.first, b = p.second
)
max({a,b,c,...})
: 최대 원소
min({a,b,c,...})
: 최소 원소
a ^ b ^ c ^ min({ a,b,c }) ^ max({ a,b,c })
: 중간값
acos(-1)
: π
n & 1
: 홀짝 판별
(n >> k) & 1
: n
의 2진법 상 k + 1
번째 비트
cin.tie(0)->sync_with_stdio(0)
: 한 줄로 줄일 수 있다.
cout << format("{:.2f}", x)
: 포맷 출력. (백준 C++23 이상)
cout << " \n"[i + 1 == N]
: 반복문이 끝나는 경우 \n
, 그외
"FFFFFFDCBAA"[n / 10]
: 문자열로 조건문 압축 ( 백준 9498 시험 성적 )
cout << dec/oct/hex << x
: 10진수, 8진수, 16진수 변환