출시·고도화 중
코딩 면접 풀이 전략 안내서 · 6/6
알고리즘 지식이 있어도 준비 계획과 시험 환경에 대한 이해가 없으면 실제 면접에서 실력을 다 보여 주기 어렵습니다. 이 장에서는 준비 계획, 국내와 해외 채용 과정의 차이, 시험장에서 쓸 코드 습관, 흔한 실수, 참고 자료를 정리합니다. 회사마다 절차가 다르고 해마다 바뀌므로 지원 전에 공고와 안내 메일을 꼭 확인하세요.
매일 조금씩, 패턴 단위로 묶어 연습하는 편이 무작위로 문제를 많이 푸는 것보다 효과적입니다.
| 주차 | 주제 | 목표 |
|---|---|---|
| 1 | 복잡도, 배열 · 문자열, 해시 맵 | 주 언어의 자료 구조 API를 막힘없이 쓰기 |
| 2 | 투 포인터, 슬라이딩 윈도우, 누적 합 | 연속 구간 문제를 O(n)으로 풀기 |
| 3 | 스택 · 큐, 정렬, 이분 탐색 | "조건을 만족하는 최솟값" 유형 익히기 |
| 4 | 트리, BFS · DFS | 재귀와 반복 두 방식으로 순회하기 |
| 5 | 그래프, 최단 경로, 위상 정렬 | 격자 문제를 그래프로 바꾸기 |
| 6 | 힙, 그리디, 백트래킹 | 상위 k개와 조합 나열 문제 |
| 7 | 동적 계획법 | 상태 정의와 점화식을 말로 설명하기 |
| 8 | 모의 면접, 오답 복습 | 시간을 재고 말하면서 풀기 |
국내 기업은 서류 전형 뒤나 함께 온라인 코딩 테스트를 치르는 경우가 많습니다. 보통 몇 시간 동안 여러 문제를 풀고 자동 채점기가 숨겨진 테스트 케이스로 점수를 매깁니다. 사용할 수 있는 언어, 외부 검색 허용 여부, 부분 점수, 화면 녹화나 감독 방식은 회사마다 다릅니다. 통과하면 기술 면접에서 제출한 코드를 설명하게 하거나, 화면 공유 상태로 새 문제를 함께 푸는 경우가 있습니다.
해외 기업은 리크루터 통화 뒤 온라인 평가나 화상 기술 면접을 거쳐, 여러 차례 연속된 면접(흔히 온사이트 또는 가상 루프라고 부릅니다)으로 이어지는 경우가 많습니다. 한 회차는 보통 45~60분이고, 공유 편집기에서 코드를 실행하지 못한 채 풀기도 합니다. 코딩 외에 시스템 설계와 행동 면접이 함께 들어가는 경우가 흔합니다.
입력이 큰 온라인 테스트에서는 Python의 기본 input()이 느릴 수 있습니다. 표준 입력을 한 번에 읽는 방식을 익혀 둡니다.
import sys
def main() -> None:
data = sys.stdin.buffer.read().split()
n = int(data[0])
nums = list(map(int, data[1:1 + n]))
print(sum(nums))
main()Python의 기본 재귀 한도는 보통 1000 정도라서 깊은 DFS는 실패할 수 있습니다. 한도를 올리는 방법도 있지만, 스택을 직접 쓰는 반복 DFS가 더 안전합니다.
def count_reachable(graph: dict[int, list[int]], start: int) -> int:
seen = {start}
stack = [start]
while stack:
node = stack.pop()
for nxt in graph.get(node, []):
if nxt not in seen:
seen.add(nxt)
stack.append(nxt)
return len(seen)
print(count_reachable({1: [2, 3], 2: [4], 3: [], 4: [1]}, 1)) # 4연습할 때는 느리지만 확실한 풀이와 빠른 풀이를 무작위 입력으로 비교하는 스트레스 테스트가 버그를 가장 빨리 찾아 줍니다.
import random
def brute(nums: list[int], k: int) -> int:
return sum(1 for i in range(len(nums)) for j in range(i, len(nums)) if sum(nums[i:j + 1]) == k)
def fast(nums: list[int], k: int) -> int:
seen, prefix, count = {0: 1}, 0, 0
for x in nums:
prefix += x
count += seen.get(prefix - k, 0)
seen[prefix] = seen.get(prefix, 0) + 1
return count
for _ in range(2000):
nums = [random.randint(-3, 3) for _ in range(random.randint(0, 8))]
k = random.randint(-3, 3)
assert brute(nums, k) == fast(nums, k), (nums, k)
print("ok")준비는 패턴 단위로 계획을 세우고, 시험 형식은 국내와 해외가 다르다는 점을 염두에 두며, 시험장에서는 빠른 입출력과 반복 DFS 같은 안전한 습관을 씁니다. 연습 단계에서는 스트레스 테스트로 스스로 버그를 찾고, 모의 면접으로 말하면서 푸는 감각을 기릅니다.
Counter, defaultdict, deque
댓글 0개
로그인 · 로그인하면 댓글을 남길 수 있습니다.
첫 댓글을 남겨 보세요.