"알고리즘은 맞는데 왜 시간 초과지?" 하반기 코테 시즌마다 스터디 톡방에서 반복되는 질문이다.
"선수과목"이라는 단어가 문제에 등장하면 머릿속에서 알고리즘들이 서로 손을 든다. DFS?
DP 문제를 30분째 붙잡고 있는 사람 옆에 가서 "dp[i] 정의가 뭐야?"라고 물어보면, 대부분 우물쭈물한다.
코딩테스트 단골 유형 중에 "그룹 나누기"가 있다. 노드끼리 연결하고, 특정 두 노드가 같은 그룹인지 판별하는 문제.
"최단 거리를 구하시오." 이 문장 보자마자 다익스트라 코드를 복붙하는 습관, 나도 있었다.
코딩테스트에서 "연속된 부분 배열"이라는 문구가 나오는 순간, 머릿속에서 이중 for문이 떠오르면 이미 시간 초과 루트에 올라탄 거다. 대부분의 연속 구간 문제는 슬라이딩 윈도우 하나면 O(n)에 정리된다.
"최솟값의 최댓값을 구하시오." 이 문장을 읽고 바로 이분 탐색이 떠오르면, 이미 절반은 맞힌 거다.
"각 원소의 오른쪽에 있는 첫 번째 더 큰 수를 구하라." 이 문장을 보면 반사적으로 이중 for문을 짠다.
연결 관계를 추적하는 문제가 나오면 대부분 DFS/BFS부터 떠올린다. 간선이 정적이고 한 번만 탐색하면 되는 상황이라면 그게 맞다.
격자 위에서 (0,0)에서 (N,M)까지 최단 거리를 구하라 — 이건 누구나 BFS를 떠올린다. 근데 "문자열 A를 문자열 B로 바꾸는 최소 연산 횟수는?
회의실이 몇 개 필요한지 물어보는 문제. 코테에서 너무 자주 나오는 유형이라 대부분은 "시작 시간 정렬 → 힙으로 종료 시간 관리"로 접근한다.
프로그래머스 Lv2를 풀다가 "이거 투 포인터 아닌가?" 싶어서 left, right 잡고 짜기 시작한다.
"정렬된 배열에서 값을 찾는 거잖아." 이분 탐색을 이렇게만 알고 있으면 코딩테스트에서 이분 탐색 문제를 절대 못 알아본다.
코테에서 가장 무서운 순간이 있다. 문제를 읽자마자 "아, 이거 그리디네" 하고 자신 있게 코드를 짰는데, 제출하면 40-60% 어딘가에서 WA가 뜨는 순간.
코테에서 "다음으로 큰 원소(Next Greater Element)"를 묻는 문제를 만나면 대부분 이중 for문을 먼저 떠올린다. O(n²)이 나오고, 시간 초과가 뜨고, 그제서야 "뭔가 다른 방법이 있나?