좌표 범위가 10^9인 문제를 처음 만나면 대부분 멈칫한다. 배열 크기를 10억으로 잡을 수는 없고, 해시맵을 쓰자니 구간 쿼리가 안 돌아간다.
문제를 읽다가 제약 조건에 "N ≤ 20"이 적혀 있으면, 그 순간부터 비트마스크 DP를 떠올려야 한다. 이건 감이 아니라 공식에 가깝다.
코딩테스트 문제를 읽는데 "가장 큰 값 중 최소", "최소 거리의 최대" 같은 표현이 나온다. 뭔가 최적화 문제 같은데 그리디도 아니고 DP도 아닌 것 같고.
N ≤ 20이면 비트마스크로 전수탐색이 가능하다는 건 많이들 안다. 2^20은 약 100만이니까.
가중치 있는 최단 경로 문제를 보면 반사적으로 다익스트라부터 꺼내는 습관, 나도 그랬다. 근데 간선 비용이 0 아니면 1뿐인 그래프라면 힙 없이 deque 하나로 O(V+E)에 끝난다.
코딩테스트 스터디에서 LIS(최장 증가 부분수열)를 다루면 항상 같은 순서로 진행된다. O(n²) DP부터 시작해서, "이건 느리니까" 하면서 O(n log n) 풀이를 소개하고, bisect_left 쓰는 코드를 보여주고, 끝.
코딩테스트에서 "두 노드가 같은 그룹인가?"라는 질문이 나오면, 많은 사람이 BFS나 DFS를 꺼낸다.
코딩테스트 단골 유형 중에 이런 게 있다. "A를 먼저 끝내야 B를 시작할 수 있고, B를 끝내야 C를 시작할 수 있다.
코테 문제의 제한 조건에 "1 ≤ N ≤ 20"이 보이면 "완전탐색이네" 하고 넘기는 사람이 많다. 반은 맞고 반은 틀리다.
코테에서 "각 원소에 대해 오른쪽에서 처음으로 더 큰 값을 찾아라" 류의 문제를 만나면, 대부분 이중 for문부터 짠다. 돌아간다.
코테 문제를 읽다가 "최솟값의 최댓값을 구하시오"를 만나면 반사적으로 DFS를 꺼내는 사람이 많다. 모든 경우를 다 해보면 되니까.
얼마 전에 "N이 20 이하면 비트마스크를 의심하라"는 글을 썼다. 그 글의 핵심은 간단했다 — 제약 조건에서 N의 크기를 보고 접근법을 결정하라는 것.
코딩테스트에서 "각 원소의 오른쪽에서 처음으로 나보다 큰 수를 찾아라" 같은 문제를 만나면, 본능적으로 이중 for문부터 떠올린다. 잘 돌아가고, 맞는 답도 나온다.
스터디에서 누군가 "이거 답을 이분탐색하면 돼"라고 말한 순간, 고개를 끄덕이면서 속으로는 물음표가 떠오른 적 있을 거다. 이분탐색은 정렬된 배열에서 값을 찾는 건데, 답을 이분탐색한다는 게 대체 무슨 소리인가.