코딩 면접 문제 모음
소프트웨어 엔지니어링 면접에 계속 나오는 빈출 코딩 문제들이에요. 문제마다 알아봐야 할 패턴, 쉬운 말로 풀어 쓴 접근법, 말해야 할 복잡도를 정리했어요. 면접관은 최종 코드만이 아니라 말로 설명하는 추론 과정을 채점해요. 접근법을 소리 내어 말하는 연습을 하세요.
Two Sum II (정렬된 입력)
쉬움정렬된 배열의 양 끝에서 포인터를 시작하세요. 합이 너무 작으면 왼쪽 포인터를 앞으로, 너무 크면 오른쪽 포인터를 뒤로 옮겨요. 정렬되어 있기 때문에 유효한 쌍을 절대 건너뛰지 않아요. 면접관은 바로 이 불변식을 소리 내어 말하길 원해요.
Valid Anagram
쉬움첫 번째 문자열의 문자 빈도를 세고, 두 번째 문자열을 훑으며 하나씩 빼서 모든 카운트가 0으로 돌아오는지 확인하세요. 묻기 전에 후속 질문을 먼저 언급하세요. 유니코드 전체를 다루면 고정된 26칸 배열은 더 이상 통하지 않으니 해시 맵을 써야 해요.
Linked List Cycle
쉬움포인터 하나는 한 노드씩, 다른 하나는 두 노드씩 전진시키세요. 둘이 만나면 사이클이 있어요. 전형적인 후속 질문인 사이클 시작점 찾기에도 대비하세요. 포인터 하나를 head로 되돌린 뒤 둘 다 한 칸씩 전진시켜 다시 만나는 곳이 시작점이에요.
Majority Element
쉬움후보 하나와 카운터를 두세요. 같으면 증가, 다르면 감소, 카운터가 0이 되면 후보를 바꿔요. 과반수 원소는 n/2번보다 많이 등장하므로 항상 살아남아요. 왜 살아남는지 설명하는 것이 면접의 핵심이에요.
Best Time to Buy and Sell Stock
쉬움지금까지 본 최저가와, 오늘 판다면 얻을 최고 수익을 추적하세요. 한 번 순회에 변수 두 개면 돼요. 이 문제는 나중에 카데인 알고리즘에서도 나오는 "가장 좋은 접두 상태를 들고 가기" 아이디어의 가장 작은 예예요. 그 연결을 짚으면 점수를 얻어요.
Merge Intervals
보통구간을 시작점으로 정렬한 다음 훑으세요. 현재 구간이 마지막으로 병합한 구간이 끝난 뒤에 시작하면 추가하고, 아니면 병합된 끝점을 둘 중 큰 값으로 늘려요. 실제 일은 정렬이 해요. 그렇다고 말하고, 비교 기준의 경계 사례(맞닿은 구간)를 정확히 처리하세요.
Longest Consecutive Sequence
보통모든 수를 셋에 넣고, 바로 앞의 수가 없는 수(수열의 시작점)에서만 세기 시작해 앞으로 걸어가세요. 각 원소는 최대 두 번만 방문하므로, "중첩 루프가 있는데요?"라는 반론에 맞서 O(n)을 방어하는 근거가 돼요.
Product of Array Except Self
보통나눗셈 없이 두 번 순회하세요. 먼저 각 칸을 그 왼쪽 원소들의 곱으로 채우고, 오른쪽에서부터 훑으며 오른쪽 원소들의 곱을 곱해 넣어요. 나눗셈 기반 답은 0이 있는 경우에 실패해요. 면접관은 보통 나눗셈을 명시적으로 금지해요.
Min Stack
보통값 스택과 함께, 맨 위가 항상 그 아래 전체의 최솟값인 최소 스택을 두세요. min(새 값, 현재 맨 위)를 push하고, pop은 함께 하세요. 이건 설계 문제예요. 채점되는 건 코드 양이 아니라 불변식이에요.
LRU Cache
보통해시 맵으로, 최근 사용 순서로 정렬된 이중 연결 리스트의 노드를 O(1)에 찾아요. 접근하면 노드를 head로 옮기고, 용량을 넘으면 tail에서 제거하세요. 센티널 head/tail 노드를 두면 null 체크 경계 사례가 모두 사라져요. 코딩을 시작하기 전에 언급하세요.
Number of Islands
보통격자를 훑으며 방문하지 않은 땅 칸마다 플러드 필(DFS 또는 BFS)을 시작해 섬 전체를 방문 처리하고, 시작한 횟수를 세세요. 방문 표시 전략(제자리에서 지우기 대 별도 셋)과 거대한 격자에서의 재귀 깊이 위험을 말하세요. 그게 시니어다운 신호예요.
Course Schedule
보통선수 과목을 방향 그래프로 모델링하세요. '모두 이수할 수 있는가'라는 질문은 정확히 '그래프에 사이클이 없는가'예요. Kahn 알고리즘(진입 차수가 0인 노드를 반복해서 제거)이나 DFS 3색 표시 모두 통해요. 하나를 골라, 남는 노드가 왜 사이클을 뜻하는지 설명하세요.
Binary Tree Level Order Traversal
보통큐로 BFS를 하되, 단계마다 큐 길이를 스냅샷해 레벨마다 리스트를 하나씩 내보내세요. 이 길이 스냅샷 기법이 재사용 가능한 핵심이에요. 지그재그 순회와 오른쪽에서 본 뷰도 수집 단계만 다른 같은 루프예요.
Validate Binary Search Tree
보통단계마다 좁혀지는 허용 범위 (min, max)를 들고 재귀하거나, 중위 순회를 해서 엄격하게 증가하는지 확인하세요. 전형적인 함정은 자식을 부모하고만 비교하는 거예요. 면접관보다 먼저 반례를 직접 만들어 보이세요.
Word Pattern
쉬움패턴 문자를 단어로, 그리고 단어를 다시 문자로 매핑하세요. 한 방향만 보면 "dog dog"에 대해 패턴 "ab"를 받아들이고 말아요. 양방향으로 전단사를 확인하는 것이 핵심 전부예요. "전단사"라는 말을 쓰고, 코딩 전에 길이가 다른 경우를 처리하세요.
Happy Number
쉬움수를 각 자릿수 제곱의 합으로 계속 바꾸면 1에 도달하거나 루프에 빠져요. 그러니 이건 모습을 바꾼 Linked List Cycle이에요. 본 적 있는 수의 셋으로 루프를 찾거나, 공간 O(1)을 위해 플로이드의 느린/빠른 포인터로 깊은 인상을 남기세요. 사이클 탐지로 환원된다는 걸 짚는 것이 시니어다운 한 수예요.
Gas Station
보통전체 연료 ≥ 전체 비용이면 답이 존재하고 유일해요. 누적 연료량을 추적하며 한 번 훑다가 음수가 되면, 실패한 구간의 어떤 주유소도 출발점이 될 수 없으니 다음 주유소에서 다시 시작하세요. 면접의 핵심은 루프 자체가 아니라 그 건너뛰기의 정당화예요.
Jump Game II
보통k번 점프로 닿을 수 있는 인덱스들을 하나의 BFS 레이어로 보세요. 현재 레이어의 오른쪽 끝과 지금까지 본 가장 먼 도달점을 추적하다가, 그 끝을 지나치면 점프 수를 늘리고 끝을 가장 먼 도달점으로 넓혀요. 큐 없는 BFS로 설명하면 여기서 왜 그리디가 최적인지가 드러나요.
Insert Interval
보통새 구간이 시작하기 전에 끝나는 구간들을 내보내고, 겹치는 구간을 모두 새 구간에 흡수한 다음(시작은 최솟값, 끝은 최댓값), 나머지를 내보내세요. 입력이 정렬되어 있으니 다시 정렬할 필요 없이 한 번이면 돼요. 왜 이게 더 쉬운지 물으면 Merge Intervals와 대비해 설명하세요.
Rotate Image
보통시계 방향 90° 회전 = 전치한 뒤 각 행 뒤집기. 추가 공간 O(1)의 깔끔한 두 번의 순회가, 압박 속에서 네 칸 순환 교환을 손으로 유도하는 것보다 나아요. 다만 면접관이 이 요령 너머를 파고들면 좌표 매핑 (i,j) → (j, n−1−i)를 설명할 준비를 하세요.
Set Matrix Zeroes
보통첫 행과 첫 열을 어느 행/열을 0으로 만들지 표시하는 저장소로 쓰고, 그 행과 열 자신의 상태는 불리언 두 개로 기억하세요. 공간 사다리를 소리 내어 따라가세요. O(mn) 복사 → O(m+n) 셋 → O(1) 빌린 공간. 그 사다리 자체가 평가 대상이에요.
H-Index
보통내림차순 정렬 후 citations[i] ≥ i+1인 가장 큰 i를 찾거나, n에서 상한을 둔 카운팅 버킷으로 정렬 없이 O(n)에 풀 수 있어요. 코딩 전에 정의를 정확히 말하세요. 이 문제의 실패는 대부분 알고리즘이 아니라 "인용이 h번 이상인 논문이 h편"을 잘못 읽는 데서 나와요.
Course Schedule II
보통Course Schedule과 같은 그래프지만, 이번에는 Kahn 알고리즘이 제값을 해요. 진입 차수가 0인 노드가 큐에서 나오는 순서가 곧 유효한 수강 순서예요. 출력된 순서가 과목 수보다 짧으면 사이클이 있는 것이니 빈 배열을 반환하세요. 대안으로 DFS 후위 순서를 뒤집는 방법도 언급하세요.
Minimum Window Substring
어려움윈도우가 필요한 문자를 모두 포함할 때까지 오른쪽 끝을 넓히고(단계마다 전체 맵을 비교하지 말고 "충족 수 대 필요 수" 카운터를 추적하세요), 여전히 유효한 동안 왼쪽 끝을 최소로 줄이며 최적값을 기록하세요. 충족 카운터 최적화가 O(n)을 지켜 줘요. 명시적으로 설명하세요.
Trapping Rain Water
어려움각 막대 위의 물은 min(왼쪽 최댓값, 오른쪽 최댓값) − 높이예요. 양 끝에서 안쪽으로 움직이는 두 포인터로, 누적 최댓값이 더 낮은 쪽을 먼저 확정할 수 있어요. 그쪽의 경계는 이미 최종값이기 때문이에요. 그 확실성이 왜 성립하는지 짚어 가세요. 그게 이 질문의 전부예요.