출시·고도화 중
코딩 면접 풀이 전략 안내서 · 1/6
코딩 면접은 정해진 시간 안에 알고리즘 문제를 풀고, 그 과정을 말로 설명하는 평가입니다. 국내에서는 온라인 코딩 테스트와 기술 면접으로 나뉘는 경우가 많고, 해외에서는 공유 편집기나 화이트보드 앞에서 면접관과 함께 푸는 라이브 코딩이 일반적입니다. 형식은 달라도 묻는 것은 비슷합니다. 처음 보는 문제를 정확히 이해하고, 알맞은 자료 구조와 패턴을 골라, 읽기 좋은 코드로 옮기고, 스스로 검증할 수 있는지입니다.
이 장에서는 면접관이 무엇을 보는지, 자주 나오는 문제 패턴을 어떤 단서로 알아보는지, 그리고 앞으로 쓸 용어를 정리합니다.
정답 코드만 보는 면접은 드뭅니다. 대부분의 회사는 평가표를 두고 여러 항목을 따로 채점합니다. 정답에 끝내 도달하지 못해도 과정이 좋으면 통과하는 경우가 있고, 정답을 냈어도 설명 없이 코드만 쳤다면 낮은 점수를 받기도 합니다.
| 평가 항목 | 보는 것 | 좋은 신호 |
|---|---|---|
| 문제 이해 | 요구 사항과 제약을 정확히 파악하는가 | 입력 범위, 빈 입력, 중복, 음수 여부를 먼저 묻습니다 |
| 문제 해결 | 무차별 대입에서 더 나은 방법으로 나아가는가 | 느린 풀이를 먼저 말하고 병목을 짚어 개선합니다 |
| 코드 품질 | 읽기 쉽고 올바른 코드를 쓰는가 | 의미 있는 이름, 작은 함수, 경계 처리 |
| 검증 | 스스로 버그를 찾는가 | 작은 예시로 손으로 따라가고 극단적인 입력을 시험합니다 |
| 의사소통 | 생각을 말로 공유하는가 | 막혔을 때 무엇을 시도하는지 말하고 힌트를 반영합니다 |
이 표에서 알 수 있듯이 말하면서 푸는 습관은 기술만큼 중요합니다. 면접관은 머릿속을 볼 수 없으므로, 말하지 않은 판단은 점수가 되지 않습니다.
면접 문제는 수없이 많지만, 풀이에 쓰이는 패턴은 생각보다 적습니다. 문제 설명에서 단서를 찾아 패턴을 떠올리는 연습이 준비의 핵심입니다.
| 패턴 | 이런 단서가 보이면 | 흔한 복잡도 |
|---|---|---|
| 해시 맵 · 해시 집합 | "이미 본 적 있는가", 개수 세기, 짝 찾기 | O(n) 시간, O(n) 공간 |
| 투 포인터 | 정렬된 배열, 양 끝에서 좁혀 오기, 제자리 정리 | O(n) 또는 정렬 포함 O(n log n) |
| 슬라이딩 윈도우 | "연속된 구간", 가장 긴 · 가장 짧은 부분 배열 | O(n) |
| 누적 합 | 구간 합을 여러 번 묻거나 합이 k인 구간 개수 | 전처리 O(n), 질의 O(1) |
| 이분 탐색 | 정렬된 데이터, "조건을 만족하는 최솟값" | O(log n) 또는 O(n log n) |
| BFS · DFS | 격자, 연결 관계, 최단 이동 횟수 | O(V + E) |
| 힙 | 상위 k개, 계속 바뀌는 최솟값 · 최댓값 | O(n log k) |
| 동적 계획법 | 경우의 수, 최적값, 겹치는 부분 문제 | 상태 수 × 전이 비용 |
| 백트래킹 | 모든 조합 · 순열 나열, 작은 n | 지수 시간 |
세 가지 기본 패턴을 짧은 코드로 보겠습니다. 모두 배열을 한 번만 훑는다는 점이 공통입니다.
정렬된 배열에서 합이 target인 두 수가 있는지 확인하는 투 포인터입니다. 합이 작으면 왼쪽을, 크면 오른쪽을 움직입니다.
def has_pair_with_sum(sorted_nums: list[int], target: int) -> bool:
lo, hi = 0, len(sorted_nums) - 1
while lo < hi:
total = sorted_nums[lo] + sorted_nums[hi]
if total == target:
return True
if total < target:
lo += 1
else:
hi -= 1
return False
print(has_pair_with_sum([1, 3, 4, 6, 9], 10)) # True (1 + 9)
print(has_pair_with_sum([1, 3, 4, 6, 9], 2)) # False길이가 k인 연속 구간의 최대 합을 구하는 고정 크기 슬라이딩 윈도우입니다. 창을 한 칸 밀 때 들어오는 값을 더하고 나가는 값을 뺍니다.
def max_window_sum(nums: list[int], k: int) -> int:
window = sum(nums[:k])
best = window
for right in range(k, len(nums)):
window += nums[right] - nums[right - k]
best = max(best, window)
return best
print(max_window_sum([2, 1, 5, 1, 3, 2], 3)) # 9 (5 + 1 + 3)처음으로 다시 나온 값을 찾는 해시 집합입니다. 리스트에서 in을 쓰면 O(n)이지만 집합에서는 평균 O(1)입니다.
def first_repeat(items: list[str]) -> str | None:
seen: set[str] = set()
for item in items:
if item in seen:
return item
seen.add(item)
return None
print(first_repeat(["a", "b", "c", "b", "a"])) # b코딩 면접은 정답과 함께 이해 · 해결 · 코드 품질 · 검증 · 의사소통을 함께 평가합니다. 문제 설명의 단서에서 해시 맵, 투 포인터, 슬라이딩 윈도우 같은 패턴을 떠올리는 연습을 하고, 생각을 소리 내어 말하는 습관을 들이면 같은 실력으로도 훨씬 좋은 평가를 받을 수 있습니다. 다음 장에서는 문제 하나를 처음부터 끝까지 푸는 절차를 단계별로 살펴봅니다.
댓글 0개
로그인 · 로그인하면 댓글을 남길 수 있습니다.
첫 댓글을 남겨 보세요.