FAANG 면접을 통과하게 만든 한 가지

발행: (2026년 6월 5일 PM 08:03 GMT+9)
5 분 소요
원문: Dev.to

출처: Dev.to

FAANG 면접을 실제로 통과하게 해준 한 가지 습관

간단한 배경 (왜 이 글을 쓰는가)

새벽 2시, 중급 수준 LeetCode 문제를 세 번째 시도하면서 화면을 뚫어지게 바라보던 기억이 난다. 시계는 똑딱거리고 심장은 두근거렸다. “답은 알고 있는데 뽑아낼 수가 없어.” 라는 생각이 계속 머릿속을 맴돌았다. 해결책을 적어 실행했지만 오답이 나왔고, 또 20분을 틀린 철자를 디버깅하는 데 보냈다. 속도를 늦추기만 하면 바로 잡을 수 있었을 텐데… 마치 생각을 배우기보다 해답을 외우는 느낌이었다. 그때 나는 한 가지 간단한 습관이 빠져 있다는 걸 깨달았다: 코드를 한 줄이라도 입력하기 전에 계획을 말해본 적이 없었다.

Explain‑then‑code.

키보드를 누르기 전에, 마치 문제를 전혀 모르는 동료에게 가르치듯, 알고리즘이 단계별로 무엇을 할지 영어(또는 한국어)로 큰소리로 말하거나 적어라. 논리를 말로 표현할 수 있을 때 비로소 코드를 작성한다.

왜 효과가 있을까?

  • 문법 오류에 시간을 낭비하기 전에 이해의 빈틈을 바로 잡게 만든다.
  • 면접관이 듣고 싶어 하는 것은 명확한 사고 과정이지, 단순히 동작하는 코드 조각만이 아니다.
  • off‑by‑one 오류, 놓친 엣지 케이스, 비효율적인 루프 등을 가장 고치기 쉬운 시점에 발견한다.

처음엔 회의적이었다. ‘추가 작업’처럼 느껴졌지만, 3일 동안 먼저 설명하기를 강요하니 모의 면접 성공률이 30 %에서 80 % 이상으로 급등했다. 눈에 띄는 기술은 아니지만, 내 준비를 무작위 암기에서 집중 연습으로 바꾼 단 하나의 습관이다.

고전 문제 예시: 중복 문자 없는 가장 긴 부분 문자열 (LeetCode 3)

def lengthOfLongestSubstring(s: str) -> int:
    max_len = 0
    for i in range(len(s)):
        seen = set()
        for j in range(i, len(s)):
            if s[j] in seen:
                break
            seen.add(s[j])
            max_len = max(max_len, j - i + 1)
    return max_len

뭐가 문제일까?
정답은 맞지만 시간 복잡도가 O(n²)이다.

작성자는 ‘브루트 포스 아이디어’를 떠올리자 바로 중첩 루프로 뛰어들었고, “선형적인 방법이 있을까?”라는 질문을 하지 않았다. 면접 상황이라면 먼저 브루트 포스를 설명하고, 그 다음에 더 나은 방법을 떠올릴 수 있었을 텐데, 이미 비효율적인 코드에 갇힌 상태가 된다.


Explain‑then‑code 버전

Step 1 – 계획을 말로 표현하기

“왼쪽과 오른쪽 인덱스로 이루어진 [left, right) 구간을 유지한다. 이 구간 안에는 항상 서로 다른 문자만 들어 있다. 오른쪽을 한 글자씩 이동하면서 문자를 집합에 추가한다. 만약 이미 집합에 존재하는 문자를 만나면, 중복이 사라질 때까지 왼쪽을 오른쪽으로 옮겨 구간을 축소한다. 매 단계마다 구간의 길이를 기록하고, 가장 큰 길이가 정답이다.”

위 설명을 자연스럽게 할 수 있을 때 코드를 작성한다.

0 조회
Back to Blog

관련 글

더 보기 »

모바일 한여름 열풍

!Cover image for Mobile Midsommer Madnesshttps://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploa...