좌표 범위가 10^9인 문제를 처음 만나면 대부분 멈칫한다. 배열 크기를 10억으로 잡을 수는 없고, 해시맵을 쓰자니 구간 쿼리가 안 돌아간다.
문제를 읽다가 제약 조건에 "N ≤ 20"이 적혀 있으면, 그 순간부터 비트마스크 DP를 떠올려야 한다. 이건 감이 아니라 공식에 가깝다.
GC 로그를 열어보면 Young Gen에서 가장 많이 죽는 객체 유형은 대체로 비슷하다. OrderLineItem, PriceInfo, DateRange 같은 불변 DTO들.
코딩테스트 문제를 읽는데 "가장 큰 값 중 최소", "최소 거리의 최대" 같은 표현이 나온다. 뭔가 최적화 문제 같은데 그리디도 아니고 DP도 아닌 것 같고.
JDK 25로 올리고 가상 스레드를 켠 팀들이 공통적으로 보고하는 증상이 있다. 처리량은 올랐는데 힙 사용량이 비정상적으로 높다.
가중치 있는 최단 경로 문제를 보면 반사적으로 다익스트라부터 꺼내는 습관, 나도 그랬다. 근데 간선 비용이 0 아니면 1뿐인 그래프라면 힙 없이 deque 하나로 O(V+E)에 끝난다.
JDK 21부터 StructuredTaskScope를 써온 팀이라면, JDK 25 업그레이드에서 컴파일 에러를 각오해야 한다. ShutdownOnFailure와 ShutdownOnSuccess — 누구나 쓰던 두 클래스가 통째로 삭제됐다.
코딩테스트 단골 유형 중에 이런 게 있다. "A를 먼저 끝내야 B를 시작할 수 있고, B를 끝내야 C를 시작할 수 있다.
코테 문제의 제한 조건에 "1 ≤ N ≤ 20"이 보이면 "완전탐색이네" 하고 넘기는 사람이 많다. 반은 맞고 반은 틀리다.
운영 서버 JDK를 25로 올리면서 -XX:+UseZGC를 슬쩍 켜본 적 있는가. GC 멈춤이 사라진 건 좋았는데, 다음 날 모니터링 대시보드를 열어보니 RSS가 이전보다 30% 가까이 뛰어 있었다.
코테에서 "각 원소에 대해 오른쪽에서 처음으로 더 큰 값을 찾아라" 류의 문제를 만나면, 대부분 이중 for문부터 짠다. 돌아간다.
코테 문제를 읽다가 "최솟값의 최댓값을 구하시오"를 만나면 반사적으로 DFS를 꺼내는 사람이 많다. 모든 경우를 다 해보면 되니까.
프로그래머스 "네트워크" 문제를 처음 풀었을 때 DFS로 연결 컴포넌트를 세는 코드를 짰다. 맞긴 맞았는데, 비슷한 문제가 나올 때마다 visited 배열 선언하고 재귀 돌리는 패턴을 반복하면서 뭔가 과하다는 느낌이 들었다.
얼마 전에 "N이 20 이하면 비트마스크를 의심하라"는 글을 썼다. 그 글의 핵심은 간단했다 — 제약 조건에서 N의 크기를 보고 접근법을 결정하라는 것.
JDK 21에서 Virtual Thread를 켰을 때 다들 환호했다. 스레드 풀 걱정 없이 요청마다 스레드 하나씩 띄우면 되니까.