좌표 범위가 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를 꺼내는 사람이 많다. 모든 경우를 다 해보면 되니까.
프로그래머스 "네트워크" 문제를 처음 풀었을 때 DFS로 연결 컴포넌트를 세는 코드를 짰다. 맞긴 맞았는데, 비슷한 문제가 나올 때마다 visited 배열 선언하고 재귀 돌리는 패턴을 반복하면서 뭔가 과하다는 느낌이 들었다.
얼마 전에 "N이 20 이하면 비트마스크를 의심하라"는 글을 썼다. 그 글의 핵심은 간단했다 — 제약 조건에서 N의 크기를 보고 접근법을 결정하라는 것.
코딩테스트에서 "각 원소의 오른쪽에서 처음으로 나보다 큰 수를 찾아라" 같은 문제를 만나면, 본능적으로 이중 for문부터 떠올린다. 잘 돌아가고, 맞는 답도 나온다.