문제 분류 3 - 면접장에는 칸 이름이 없습니다

코딩 인터뷰 문제는 55개입니다 의 표는 왼쪽에서 오른쪽으로 읽습니다. 원형 이름이 있고, 그 옆에 Input 과 Output 이 있습니다.

면접은 반대입니다. 지문 하나가 주어지고, 칸 이름은 안 옵니다. 그러니 쓸 수 있으려면 오른쪽에서 왼쪽으로도 읽혀야 합니다.

1. 지문에서 보이는 것

지문을 읽을 때 눈에 걸리는 것들이 있습니다. 알고리즘 이름이 아니라, 그냥 적혀 있는 것입니다.

지문에 보이면후보가르는 질문
정렬돼 있다 · 정렬해도 된다Two ends moving in · Boundary by monotonicity짝을 찾나, 경계를 찾나
연속한 구간Window over a sequence · Largest run조건을 만족하는 구간인가, 합이 최대인 구간인가
늘어나기만 하는 가장 긴 것Longest increasing subsequence연속이어야 하나
각 자리에서 처음 만나는 더 크거나 작은 것Next greater element지금보다 작은 과거가 영영 쓸모없나
구간을 여러 번 묻는다Prefix and range중간에 값이 바뀌나
k번째Kth element · Pull the best one next한 번 묻나, 계속 묻나
합이 목표가 되는 둘 또는 셋Pair with target정렬해도 되나
몇 번 나왔나 · 과반 · 빠진 값Count and tally값의 범위가 좁나
어떻게 정렬할지부터 정해야 한다Sort then scan한 기준을 고정하면 나머지가 단순해지나
시작과 끝이 있는 것들Intervals시작으로 정렬하나, 끝으로 정렬하나
먼저 해야 할 일이 있다Topological order사이클이면 답이 없다
섬 · 덩어리 · 같은 그룹인가Connected components간선이 한꺼번에 오나, 하나씩 오나
사이클이 있나Cycle다음이 하나뿐인가, 여러 갈래인가
전부 잇는 최소 비용 · 최대로 흘릴 양Spanning and flow두 편으로 나뉘나
최소 비용 · 최소 걸음Shortest path가중치가 전부 1인가, 음수가 있나
격자Walk a grid · Grid DP · Simulate on a grid퍼지나, 한 방향으로만 가나, 규칙을 반복하나
행마다 정렬되고 열마다 정렬된 표Search a sorted grid한 줄로 펴도 정렬인가
행렬을 돌리거나 뒤집어라Transform in place추가 공간을 못 쓰나
트리Walk a tree · Tree DP한 번 훑으면 끝나나, 부분 트리마다 골라 가며 올라가나
순회 결과가 주어진다Build a tree뿌리를 어디서 아나
왼쪽이 작고 오른쪽이 큰 트리Binary search tree정렬된 수열을 만드나, 꺼내나
두 노드의 공통 조상Lowest common ancestor정렬 성질을 쓸 수 있나
회문Palindrome가운데에서 퍼지나, 양끝에서 좁히나
괄호나 연산자Brackets and expressions중첩이 있나
문자열이나 배열 둘Edit distance · Common subsequence고치는 비용인가, 공통인 것인가
긴 글에서 조각을 찾아라Pattern in text조각이 여럿인가
이 접두사로 시작하는 단어Prefix set질의가 반복되나
글자를 다시 배열한 것인가Same letters같은지만 보나, 같은 것끼리 묶나
규칙대로 고쳐 써라Rewrite a string규칙이 한 번에 끝나나, 나온 결과에 또 적용되나
단계마다 고른다Carry state forward상태 수를 미리 아나, 입력에 따라 늘어나나
방법이 몇 가지냐Count the ways · Combinatorics한 단계씩 세어 올라가나, 공식으로 한 번에 세나
구간을 합쳐 간다Interval DP마지막에 무엇을 하느냐로 나뉘나
한도나 목표를 두고 고른다Knapsack같은 걸 여러 번 쓰나
모든 배치를 보랜다List every arrangement가지치기가 되나
고른 것의 조합이 상태가 된다Small n, every subset부분집합만 상태로 쓰면 되나, 지금 어디인지도 들고 가야 하나
번갈아 둔다Win or lose판이 독립된 더미로 쪼개지나
하나만 빼고 짝이 맞는다Bit tricks짝이 몇 개씩 맞나
소수 · 약수 · 배수Divisors and primes하나를 보나, 범위를 보나
진법 · 자릿수 · 아주 큰 수Digits and bases자료형 범위를 넘나
무작위로 뽑아라Chance and sampling전체 크기를 미리 아나
연산 목록과 시간 제약Design a structure넣을 때 일을 해두나, 꺼낼 때 하나
용량이 차면 버려라Cache and eviction버리는 기준이 시간인가 횟수인가
한쪽 끝에서만 넣고 뺀다Stack and queue discipline최솟값 같은 걸 같이 묻나
넣고 빼고 찾기가 전부 빨라야 한다Key to value무작위 추출이 끼어 있나
하나씩 꺼내 달라Iterate on demand미리 다 펼쳐도 되나
노드가 이어져 있다Linked list surgery길이를 미리 아나

왼쪽은 답을 몰라도 보입니다. Monotonic Stack 은 단조 스택을 떠올려야 열리지만, "각 자리에서 다음으로 큰 것"은 지문에 그냥 적혀 있습니다.

2편의 55개 중 하나는 여기 없습니다. Geometry 는 지문에서 알아볼 신호가 "도형이 나온다" 말고는 없습니다. 신호가 약한 칸이 있다는 것도 알아둘 만합니다 — 그런 문제는 읽자마자 아는 수밖에 없습니다.

2. 제약 조건도 지문입니다

n 의 크기가 적혀 있으면 답의 복잡도가 거의 정해집니다.

  n ≤ 20          2ⁿ            부분집합을 전부 본다
  n ≤ 40          2^(n/2)       반으로 쪼개 만나기
  n ≤ 500         n³
  n ≤ 5,000       n²
  n ≤ 10⁵         n log n       정렬 · 이분탐색 · 힙 · 세그먼트 트리
  n ≤ 10⁷         n             한 번 훑기
  값이 10⁹까지     log(값) 또는 수학  크기가 아니라 수 자체가 크다

다만 이건 좁혀주는 것이지 정해주는 것이 아닙니다. n ≤ 20 이면 비트마스크 DP 일 수도 있고 그냥 백트래킹일 수도 있습니다. 후보를 몇 개로 줄여줄 뿐입니다.

3. 후보가 둘 이상일 때

여기서부터가 진짜입니다. 신호로 후보를 둘셋 줄였는데 그중 뭘 쓸지 모를 때, 이 순서로 묻습니다.

  ① 그냥 다 해보면 어떻게 하나
  ② 그게 왜 느린가
  ③ 무엇을 다시 안 해도 되나
  ④ 그래서 뭘 쓰나
  ⑤ 그게 왜 맞나

합이 K 이상인 가장 짧은 구간 으로 해보겠습니다.

  ①  모든 구간을 본다                        n²
  ②  왼쪽 끝을 옮길 때마다 합을 처음부터 다시 더한다
  ③  왼쪽 끝을 되돌릴 일이 없다 — 오른쪽을 늘렸다 왼쪽을 당기면 된다
  ④  슬라이딩 윈도우
  ⑤  합이 K 에 닿으면 왼쪽을 당겨도 되고, 모자라면 오른쪽을 늘려야 한다.
      양쪽 다 되돌아갈 일이 없으니 각 원소를 많아야 두 번 본다

③이 답입니다. 나머지는 거기 닿기 위한 질문입니다.

그리고 ③이 안 나오면 그 문제는 아직 모르는 겁니다. 방법 이름을 떠올렸는지와는 상관이 없습니다 — "슬라이딩 윈도우"라고 말할 수 있어도 ③을 못 하면 변형이 나왔을 때 막힙니다.

여기서 음수가 섞이면 ③이 깨집니다. 왼쪽을 당겨도 합이 줄어든다는 보장이 없으니까요. 가르는 조건 칸에 그렇게 적어둔 이유입니다.

4. 복습하는 법

  왼쪽만 보고 오른쪽을 가린다        신호 → 후보 → 가르는 질문 순으로 떠올린다
  막히면 ①~⑤ 를 소리 내서 한다      ③ 에서 막히는지 ④ 에서 막히는지 확인
  틀린 것을 더 자주 본다
  맞힌 것은 시간을 두고 다시 본다     바로 다시 보면 맞히는 게 당연하다

섞을 때는 헷갈리는 것끼리 섞습니다. 아무거나 뒤섞는 게 아니라 Window over a sequence 와 Largest run 처럼 Input 과 Output 이 거의 같은 것들을 나란히 놓습니다. 물어볼 것은 하나입니다 — 왜 이건 저 방법이 되는데 옆엣것은 안 되나.

섞으면 연습할 때는 더 못합니다

이걸 수학 문제로 잰 실험이 있습니다. 대학생 18명에게 낯선 입체 네 개의 부피 구하는 법을 가르치고, 한쪽은 같은 종류끼리 묶어서 연습시키고 다른 쪽은 네 종류를 섞어서 연습시켰습니다. 문제도 개수도 똑같고 순서만 달랐습니다.

  연습하는 동안      묶은 쪽  89%     섞은 쪽  60%
  일주일 뒤 시험     묶은 쪽  20%     섞은 쪽  63%

틀린 이유가 중요합니다. 묶어서 연습한 쪽은 계산을 틀린 게 아니라 어느 공식을 쓸지를 틀렸습니다. 공식만 맞게 적으면 답은 거의 다 맞았습니다.

묶어서 풀면 어느 것인지 고를 일이 없습니다. 알려주고 시작하니까요. Largest run 을 열 개 연속으로 풀면 열 번 다 답을 알고 시작합니다. 면접에는 그 알려주는 사람이 없습니다.

그런데 연습하는 동안에는 묶은 쪽이 더 잘합니다. 89% 대 60%. 그래서 섞으면 손해 보는 것처럼 느껴집니다. 그림을 보고 화가를 맞히는 다른 실험에서는 섞은 쪽이 더 나았던 사람이 120명 중 78% 였는데, 묶는 쪽이 낫거나 비슷했다고 답한 사람도 78% 였습니다. 시험을 치고 난 뒤에 물어봐도 그랬습니다. 느낌이 반대로 갑니다.

둘 다 실험실에서 대학생에게 잰 것입니다. 그리고 Rohrer & Taylor 는 자기 실험의 한계를 직접 넷 적어뒀는데, 그중 하나가 면접에는 제일 아픕니다 — 시험 문제가 연습 문제와 같은 꼴이어서, 처음 보는 변형에도 통하는지는 재지 않았습니다.

그리고 소리 내서 해보십시오. 면접은 푸는 시험이 아니라 푸는 과정을 보여주는 시험인데, 혼자 조용히 푸는 연습만 하면 그 부분이 훈련되지 않습니다. ①~⑤ 를 말로 하면 복습과 말하기가 같이 됩니다.

출처

  • Rohrer & Taylor 2007 · Doug Rohrer, Kelli Taylor, "The shuffling of mathematics problems improves learning", Instructional Science 35:481–498. 위 수치는 Experiment 2 입니다.
  • Kornell & Bjork 2008 · Nate Kornell, Robert A. Bjork, "Learning Concepts and Categories: Is Spacing the 'Enemy of Induction'?", Psychological Science 19(6):585–592. 위 수치는 Experiment 1a 입니다.