Cracking the Coding Interview, 189 Programming Questions & Solutions, Grale Laakmann McDowell

Introduction

다수의 최고 기술 회사(그리고 많은 다른 회사들)에서는 알고리즘과 코딩 문제가 인터뷰 과정의 주요 구성 요소입니다. 이러한 문제들을 문제 해결 질문으로 생각할 수 있습니다. 인터뷰어는 여러분이 이전에 보지 못한 알고리즘 문제를 해결할 수 있는 능력을 평가하려고 합니다. 대부분의 경우, 인터뷰에서 한 문제만 풀게 될 것입니다. 45분은 그리 긴 시간이 아니며, 그 시간 동안 여러 가지 다른 문제들을 해결하는 것은 어려울 수 있습니다. 문제를 풀면서 가능한 한 말로 생각 과정을 설명하도록 노력해야 합니다. 인터뷰어는 때로는 도움을 주기 위해 개입할 수 있습니다. 그들을 도와주는 것은 정상적이며, 실력이 나쁘다는 의미는 아닙니다. (그럼에도 불구하고 힌트가 필요하지 않는 것이 더 좋습니다.) 인터뷰가 끝날 때, 인터뷰어는 여러분의 성과에 대한 직관을 갖게 될 것입니다. 숫자 점수가 여러분의 성능에 할당될 수 있지만, 실제로는 양적 평가가 아닙니다. 어떤 것에 대해 얼마나 많은 점수를 얻는지 보여주는 차트가 없습니다. 그렇게 동작하지 않습니다. 대신, 인터뷰어는 일반적으로 다음과 같은 기준을 기반으로 여러분의 성과를 평가할 것입니다: • 분석력: 문제 해결에 많은 도움이 필요했나요? 솔루션은 얼마나 최적화되었나요? 솔루션을 찾는 데 얼마나 시간이 걸렸나요? 새로운 솔루션을 디자인/설계해야 했다면 문제를 잘 구조화하고 다른 결정의 트레이드오프를 고려했나요? • 코딩 기술: 알고리즘을 합리적인 코드로 성공적으로 번역할 수 있었나요? 코드는 깨끗하고 잘 구성되었나요? 잠재적인 오류를 생각했나요? 좋은 스타일을 사용했나요? • 기술 지식 / 컴퓨터 과학 기초: 컴퓨터 과학과 관련 기술에 대한 튼튼한 기초가 있나요? • 경험: 과거에 좋은 기술적 결정을 내렸나요? 흥미로운 도전적인 프로젝트를 개발했나요? 열정, 진취성 및 기타 중요한 요소를 보였나요? • 문화 적합성 / 커뮤니케이션 기술: 여러분의 성격과 가치가 회사와 팀과 어울리나요? 인터뷰어와 원활하게 의사 소통했나요? 이러한 영역의 가중치는 질문, 인터뷰어, 역할, 팀 및 회사에 따라 다양할 것입니다. 표준 알고리즘 질문에서는 주로 위의 세 가지에 가까울 수 있습니다.

Why?

이것은 이 프로세스를 시작하는 후보자들이 가장 흔히 가지는 질문 중 하나입니다. 왜 이렇게 하는 것일까요? 결국,

  1. 많은 우수한 후보자들이 이러한 종류의 인터뷰에서 성적이 좋지 않을 수 있습니다.

  2. 만약 그런 문제가 실제로 발생한다면 답을 찾아볼 수 있습니다.

  3. 실제 세계에서 이진 탐색 트리와 같은 자료 구조를 거의 사용하지 않습니다. 그런 필요성이 있다면 학습할 수 있을 것입니다.

  4. 화이트보드 코딩은 인공적인 환경입니다. 현실 세계에서 화이트보드에 코딩하는 일은 분명히 없을 것입니다.

이러한 불만사항은 근거가 없는 것은 아닙니다. 실제로, 적어도 일부 부분에서는 이에 동의합니다. 그러나 동시에, 모든 직무에 대해 아니라 일부 직무에 대해 이러한 방식으로 일을 하는 이유가 있습니다. 여러분이 이 논리에 동의하는 것은 중요하지 않지만, 왜 이러한 질문이 제기되는지를 이해하는 것이 좋습니다. 이는 인터뷰어의 사고 방식을 조금이나마 이해하는 데 도움이 됩니다.

False negatives are acceptable.

이것은 안타까울 뿐만 아니라 후보자들에게는 짜증나는 상황이지만 사실입니다. 회사의 관점에서는 일부 우수한 후보자가 거부되는 것은 사실 상관없습니다. 회사는 훌륭한 직원 집합을 구축하기 위해 노력하고 있으며, 일부 우수한 인재들을 놓치는 것을 받아들일 수 있습니다. 물론 놓치고 싶지 않겠지만, 이는 인력 채용 비용을 높일 수 있으므로 수용 가능한 절충안입니다. 그러나 그들은 거짓 양성에 훨씬 더 관심이 있습니다. 인터뷰에서 잘 하는데 실제로는 그렇게 뛰어나지 않은 사람들을 의미합니다.

Problem-solving skills are valuable.

여러 어려운 문제를 해결할 수 있다면 (어쩌면 도움을 받아), 아마도 최적의 알고리즘을 개발하는 데 꽤 뛰어난 것입니다. 여러분은 똑똑합니다. 똑똑한 사람들은 일반적으로 좋은 결과를 얻습니다, 그리고 그것은 회사에서 가치 있는 것입니다. 물론 이게 전부는 아니지만, 정말 좋은 요소 중 하나입니다.

Basic data structure and algorithm knowledge is useful.

많은 면접관들은 기본 컴퓨터 과학 지식이 사실 유용하다고 주장할 것입니다. 트리, 그래프, 리스트, 정렬 및 기타 지식을 이해하는 것이 주기적으로 필요합니다. 그럴 때, 이 지식은 정말로 가치 있는 것입니다. 필요한 대로 배울 수 있을까요? 물론 가능합니다. 그러나 이진 탐색 트리와 같은 것의 존재를 모르면 사용해야 할지 알기가 매우 어렵습니다. 그리고 그 존재를 알고 있다면, 기본 사항을 대부분 알게 됩니다. 다른 면접관들은 데이터 구조와 알고리즘에 의존하는 것을 “프록시”로 보고 정당화합니다. 기술을 스스로 배우는 것이 그리 어렵지 않더라도, 이것은 좋은 개발자와 상당히 잘 상관됩니다. 이것은 컴퓨터 과학 프로그램을 거친 경우(이 경우 기술적 지식을 상당히 폭넓게 배웠고 유지한 경우) 또는 스스로 이러한 지식을 습득한 경우 모두 좋은 조짐입니다. 데이터 구조와 알고리즘 지식이 나오는 또 다른 이유는 이러한 지식을 포함하지 않는 문제 해결 질문을 작성하기가 어렵기 때문입니다. 사실 대부분의 문제 해결 질문은 이러한 기본 사항 중 일부를 포함합니다. 충분한 후보자가 이러한 기본 사항을 알고 있다면 이러한 기본 사항을 사용한 질문 패턴으로 빠르게 전환하기가 쉽습니다.

11 The Interview Process

Whiteboards let you focus on what matters.

화이트보드에서 완벽한 코드를 작성하는 데 어려움을 겪을 것이 사실입니다. 다행히 인터뷰어는 그런 것을 기대하지 않습니다. 거의 모든 사람은 어떤 버그나 작은 문법적 오류를 갖고 있습니다. 화이트보드의 좋은 점은 어떤 측면에서는 큰 그림에 집중할 수 있다는 것입니다. 컴파일러가 없으므로 코드를 컴파일할 필요가 없습니다. 전체 클래스 정의와 보일러플레이트 코드를 작성할 필요가 없습니다. 코드의 흥미로운 “본질적인” 부분에 집중할 수 있습니다. 직접적인 문제의 핵심인 함수에 집중할 수 있습니다. 이것은 유사코드만 작성하거나 정확성이 중요하지 않다는 것을 의미하는 것은 아닙니다. 대부분의 인터뷰어는 유사코드를 허용하지 않으며, 더 적은 오류가 더 좋습니다. 화이트보드는 후보자들이 더 많이 이야기하고 사고 과정을 설명하도록 격려하는 경향이 있습니다. 후보자에게 컴퓨터를 제공하면 그들의 의사 소통이 현저히 줄어듭니다.

But it’s not for everyone or every company or every situation.

위의 내용은 회사의 사고 과정을 이해하는 데 도움을 주기 위한 것입니다. 제 개인적인 생각은 무엇일까요? 적절한 상황에서, 잘 실행될 때, 이것은 누군가의 문제 해결 능력을 합리적으로 평가하는 방법이며, 잘 하는 사람들은 대체로 똑똑하다는 점에서 합리적입니다. 그러나 이것은 종종 잘 실행되지 않습니다. 나쁜 면접관이나 나쁜 질문을 하는 사람들이 있습니다. 또한 모든 회사에 적합한 것은 아닙니다. 일부 회사는 이전 경험을 더 중요하게 생각해야 하거나 특정 기술 기술을 필요로 할 수 있습니다. 이러한 종류의 질문은 그러한 측면에 크게 중점을 두지 않습니다. 또한 누군가의 직업 윤리나 집중력을 측정하지 못할 것입니다. 그럼에도 불구하고 거의 모든 면접 프로세스가 이를 정말로 평가하기 어렵습니다. 이것은 어떤 면에서도 완벽한 프로세스가 아니지만, 무엇이 완벽한가요? 모든 면접 프로세스는 단점을 갖고 있습니다. 마지막으로 이렇게 마무리하겠습니다. 이게 바로 그런 거예요, 그래서 최선을 다하도록 노력합시다.

How Questions are Selected

지원자들은 종종 특정 회사에서 “최근” 인터뷰 질문이 무엇인지 자주 물어봅니다. 이런 질문을 하면 질문이 어디에서 나왔는지에 대한 기본적인 오해가 드러납니다. 대부분의 회사에서 질문 목록이나 인터뷰어가 무엇을 물어봐야 하는지에 대한 목록이 존재하지 않습니다. 대신, 각 인터뷰어가 자신만의 질문을 선택합니다. 질문이 어떤 형태로든 자유롭게 진행되기 때문에, 질문을 “최근 Google 인터뷰 질문”으로 만드는 것은, 우연히 Google에서 일하는 어떤 인터뷰어가 그 질문을 최근에 물어봤다는 사실 이외에는 아무 것도 없습니다. 올해 Google에서 물어본 질문들은 실제로 세 년 전에 물어본 질문들과 별반 다르지 않습니다. 사실, Google에서 물어본 질문들은 일반적으로 비슷한 회사들에서 물어본 질문들과 크게 다르지 않습니다(아마존, 페이스북 등). 회사마다 몇 가지 큰 차이점이 있습니다. 어떤 회사는 알고리즘에 중점을 둡니다(시스템 디자인을 포함한 경우가 많습니다), 다른 회사들은 지식 기반 질문을 좋아합니다. 그러나 특정 질문 범주 내에서, 한 회사에 속한다고 해서 다른 회사에 속하지 않는 것은 별로 없습니다. Google의 알고리즘 질문은 본질적으로 Facebook의 알고리즘 질문과 크게 다르지 않습니다.

It’s All Relative

만약 평가 체계가 없다면 어떻게 평가되나요? 인터뷰어는 여러분에게 어떤 기대를 가져야 하는지 어떻게 알 수 있을까요? 좋은 질문입니다. 실제로 이해하면 매우 합리적인 답변입니다. 인터뷰어는 동일한 질문을 받은 동일한 인터뷰어에 의해 그 질문에 대한 다른 후보자들과 여러분을 상대적으로 평가합니다. 이것은 상대적인 비교입니다. 예를 들어, 어떤 멋진 두뇌 문제나 수학 문제를 생각해냈다고 가정해 봅시다. 여러분은 친구인 알렉스에게 질문하고, 그는 30분이 걸려 문제를 풉니다. 벨라에게 물어보고 50분이 걸립니다. 크리스는 문제를 해결하지 못하고, 덱스터는 15분이 걸리지만, 여기에 상당한 힌트를 주어주어야 했고, 힌트 없이는 훨씬 더 오래 걸릴 것입니다. 엘리는 10분이 걸리고, 여러분이 생각하지 못한 대안적인 방법을 제안합니다. 프레드는 35분이 걸립니다. 여러분은 “와, 엘리는 정말 잘 했어. 아마도 그녀는 수학이 잘하는 사람인 것 같아.”라고 생각할 것입니다. (물론, 그녀는 단순히 운이 좋았을 수도 있고, 크리스는 운이 나빴을 수도 있습니다. 여러분은 좋은 또는 나쁜 운이 아니라는 것을 확실히 하기 위해 몇 가지 더 질문할 수 있습니다.) 인터뷰 질문 역시 비슷한 방식으로 진행됩니다. 여러분의 인터뷰어는 다른 사람들과 여러분을 비교하여 여러분의 성과를 평가합니다. 이는 그 주에 인터뷰하는 후보자들에 관한 것이 아닌, 그 질문을 그녀가 이전에 물어본 모든 후보자들에 관한 것입니다. 이러한 이유로 어려운 문제를 받는 것은 나쁜 일이 아닙니다. 여러분에게 어려운 문제일수록 모든 사람에게 어려운 문제이며, 여러분이 잘 해낼 확률을 낮추지 않습니다.

Frequently Asked Questions

I didn’t hear back immediately after my interview. Am 1 rejected?

아니요, 회사의 결정이 지연될 수 있는 이유는 여러 가지가 있습니다. 매우 간단한 설명으로는 여러분의 인터뷰어 중 한 명이 아직 피드백을 제공하지 않았을 수 있습니다. 거의 없지만 거의 모든 회사가 거절된 후보자에게 응답하지 않는 정책을 가지고 있지 않습니다. 인터뷰 이후 3-5 영업일 내에 회사로부터 소식을 듣지 못한 경우, (정중하게) 여러분의 인사 담당자에게 문의해 보세요.

Can I re-apply to a company after getting rejected?

대부분의 경우, 처음 나쁜 면접은 다시 면접을 볼 때 큰 영향을 미치지 않습니다. 많은 사람들이 Google이나 Microsoft에서 거절을 받고 나중에 입사 제안을 받습니다. 거의 항상 그렇지만 일반적으로 어느 정도 기다려야 합니다(6개월에서 1년).