접근 순서
- 기능 찾기 — 문제에서 요구하는 동작을 목록으로 분리
- 상세 설계 — 각 기능에 살 붙이기 (조건, 순서, 예외)
- 시간복잡도 추정 — 풀기 전에 O(?) 계산해서 가능한지 확인
- 구현 — 기능 단위로 함수 분리하며 작성
- 경계 조건 검증 — 최솟값, 최댓값, 빈 입력 등 테스트
시간복잡도 기준 (1억 연산 ≈ 1초)
| N 범위 |
허용 복잡도 |
| N ≤ 100 |
O(N³) |
| N ≤ 1,000 |
O(N²) |
| N ≤ 100,000 |
O(N log N) |
| N ≤ 1,000,000 |
O(N) |
자주 쓰는 패턴
방향 벡터 (상하좌우)
int[] dx = {-1, 1, 0, 0};
int[] dy = {0, 0, -1, 1};
범위 체크
boolean inRange(int x, int y, int N, int M) {
return x >= 0 && x < N && y >= 0 && y < M;
}
90도 회전 (시계방향)
// (x, y) → (y, N-1-x)
int nx = y;
int ny = N - 1 - x;
체크리스트
주의사항
- 문제를 있는 그대로 코드로 옮기는 것이 핵심 — 과도한 최적화 X
- 변수명을 문제 용어와 맞추면 디버깅이 쉬워짐
- 기능별 함수 분리 → 검증이 쉬워짐