이 글은 원래 제가 소프트웨어 엔지니어가 되기 위해 정리한 짧은 주제들이었습니다. 그러나 지금은 보다시피 주제들이 굉장히 많아졌습니다. 아래 내용을 모두 습득한 후, 저는 아마존에 소프트웨어 엔지니어로 채용되었습니다! 여러분은 아마 아래 글들을 모두 다 공부할 없을 겁니다. 아무튼 여러분에게 필요한 모든 것은 여기에 있습니다.
몇 달 동안 저는 하루에 8-12시간 정도 공부했습니다. 다음 글에는 제 이야기를 적어놓았습니다. Google 면접을 위해 8개월 동안 풀 타임으로 공부한 이유
반드시 읽어주세요: 다시 한번 말하지만, 여러분은 여기에 있는 글들을 모두 알 필요는 없습니다. 저는 제가 알지 않아도 될 것에 많은 시간을 뺏겼습니다. 여러분의 귀중한 시간을 잃지 않게 해당 파트에 더 자세하게 적어놓겠습니다.
여기에 정리된 글들은 아마존, 페이스북, 구글, 마이크로소프트 같은 거대 기업을 포함한 거의 모든 소프트웨어 회사의 면접을 준비하는 데에 도움이 될 것입니다.
행운을 빕니다!
이 글은 저의 대기업의 소프트웨어 엔지니어가 되기 위한 여러 달에 걸친 공부계획을 적어놓은 것입니다.
필요한 것:
- 조금이라도 코딩을 해본 경험 (변수, 반복문, 메서드/함수 등등)
- 인내심
- 시간
주의) 이 글은 소프트웨어 엔지니어가 되기 위한 계획이지 웹 개발을 배우기 위한 것이 아닙니다.구글, 아마존, 페이스북 그리고 마이크로소프트 같은 대기업은 소프트웨어 엔지니어링이랑 웹 개발을 서로 다른 것으로 봅니다. 예를 들어, 아마존에는 프론트엔드 엔지니어와 소프트웨어 개발 엔지니어가 있습니다. 이 두 역할은 서로 나뉘어져있으므로 면접 역시 같게 보진 않을 것이고, 갖추어야할 역량 역시 다릅니다. 위의 회사들은 소프트웨어 개발자/엔지니어 역할에 좀 더 전문적인 컴퓨터 과학 지식을 요구합니다.
- 이건 대체 뭐하는 건가요?
- 이걸 왜 해야하죠?
- 어떻게 하면 되나요?
- 머리가 나쁘다고 자책하지 마세요
- 영상 자료에 관하여
- 프로그래밍 언어 선택하기
- 자료구조와 알고리즘에 대한 도서
- 면접 준비 관련 도서
- 저와 같은 실수는 하지마세요
- 다루지 않을 것
- 하루하루의 계획
- 코딩 질문 연습하기
- 코딩 문제들
- 알고리즘 복잡도 / Big-O / 점근적 분석
- 자료구조
- 추가 지식
- 트리
- 트리 - 배경 지식
- 이진 탐색 트리 (BST)
- 힙 / 우선순위 큐 / 이진 힙
- 균형 탐색 트리 (간단한 개념)
- 트리 순회: 전위 순회, 중위 순회, 후위 순회, 너비 우선 탐색(BFS), 깊이 우선 탐색(DFS)
- 정렬
- 선택 정렬
- 삽입 정렬
- 힙 정렬
- 퀵 정렬
- 병합 정렬
- 그래프
- 방향 그래프
- 무방향 그래프
- 인접 행렬
- 인접 리스트
- 그래프 순회: 너비 우선 탐색(BFS), 깊이 우선 탐색(DFS)
- 더 많은 지식
- 최종 검토
---------------- 이 아래로는 전부 선택사항입니다 ----------------
- 추가 도서
- 추가 주제
- 컴파일러
- Emacs 와 vi(m)
- 유닉스 명령어 도구
- 정보 이론
- 패리티 & 해밍코드
- 엔트로피
- 암호기법
- 압축
- 컴퓨터 보안
- 가비지 콜렉션
- 병렬 프로그래밍
- 메세징, 직렬화, 그리고 큐잉 시스템
- A* 알고리즘
- 고속 푸리에 변환(FFT)
- 블룸 필터
- HyperLogLog
- Locality-Sensitive Hashing
- van Emde Boas 트리
- Augmented Data Structures
- 균형 탐색 트리
- AVL 트리
- Splay 트리
- 레드블랙 트리(RBT)
- 2-3 탐색 트리
- 2-3-4 트리(aka 2-4 트리)
- N-ary (K-ary, M-ary) 트리
- B-트리
- k-D 트리
- 스킵 리스트
- 네트워크 플로우(유량)
- 분리집합 & 유니온 파인드(Disjoint Sets & Union Find)
- 빠른 프로세싱을 위한 수학
- 트립
- 선형 계획법
- 기하학, 볼록 껍질
- 이산수학
- 기계학습
- 몇몇 주제에 대한 세부사항
- 영상 자료
- 컴퓨터 과학 강의들
- 논문들
대기업에서 소프트웨어 엔지니어로 일하기 위해서는 알아야 할 것들이 많습니다.
만약 여러분이 저처럼 컴퓨터 관련 전공이 아니라면 이 과정은 전공자들을 따라잡으면서도 4년이라는 시간을 절약하게 해줍니다.
제가 이 프로젝트를 시작했을 때, 저는 힙이나 스택, 시간 복잡도, 트리, 그래프 순회 등에 대하여 전혀 아는 바가 없었습니다. 만약 그 때의 제가 정렬 알고리즘을 직접 코딩해야 할 일이 있었다면, 아마 제 코드는 끔찍한 상태였을 겁니다. 제가 사용했던 모든 자료 구조는 이미 언어 안에서 구현되어 있던 것들이고, 저는 그것들이 보이지 않는 곳에서 어떻게 작동하고 있는지 몰랐습니다. 실행 중인 프로세스가 메모리 초과 에러를 메시지를 보내지 않는 이상 메모리를 관리할 필요조차 없었고, 에러가 발생하면 그제야 해결책을 찾곤 했습니다. 또한 저는 몇몇 다차원 배열이나 연관 배열을 사용한 적은 있지만, 자료구조를 완전 밑바닥부터 구현해 본 적은 없었습니다.
매우 긴 과정이고 몇 달이나 걸릴지 모릅니다. 그렇치만 여러분이 이런 분야에 익숙하다면 분명 훨씬 더 적은 시간이 걸릴 겁니다.
아래에 있는 모든 것들은 대략적인 개요이며 여러분은 위에서 아래 순서대로 차근차근 진행해야 합니다.
이 글은 진행 상황 파악을 위해 목차를 만드는 등 Github 특유의 마크다운을 이용한 방식을 사용하고 있습니다.
새 브랜치를 만들어서 중괄호에 x를 추가하는 식으로 항목을 체크하세요: [x]
브랜치를 포크(fork)하고 아래의 커맨드들을 입력하세요
포크 버튼을 눌러 Github https://github.com/jwasham/coding-interview-university 레포지토리를 포크하세요.
로컬 레포지토리에 클론(clone)하기:
git clone [email protected]:<your_github_username>/coding-interview-university.git
git checkout -b progress
git remote add jwasham https://github.com/jwasham/coding-interview-university
git fetch --all
끝났으면 박스를 x로 체크하기:
git add .
git commit -m "Marked x"
git rebase jwasham/main
git push --set-upstream origin progress
git push --force
- 성공한 소프트웨어 엔지니어들은 똑똑합니다. 하지만 그들조차도 자신들의 지적 능력에 대해서 불안감을 갖기 일쑤입니다.
- 천재 프로그래머에 대한 미신(迷信)
- 위험한 홀로서기: 테크 산업의 보이지 않는 괴물들의 전쟁
몇몇 영상들은 Cousera, Edx에 등록을 해야만 접근할 수 있습니다. 이들을 MOOCs라고 부르기도 합니다. 가끔씩 강의가 진행중이지 않아서 몇 달 동안 기다려야 할 수도 있습니다.
YouTube 온라인 강의 동영상과 같이 무료이고 항상 접근 가능한 동영상 소스들을 추가해주신다면 많은 분이 온라인 강의가 다시 시작할 때까지 기다리지 않고 언제나 공부할 수 있게 될 테니 정말 감사하겠습니다.
여러분은 코딩 면접용 프로그래밍 언어도 선택해야하지만, 컴퓨터 과학을 배우기 위한 프로그래밍 언어 역시 선택해야합니다.
왠만하면 둘 다에 해당하는 언어를 골라서 일단 하나에 숙달되도록 하는 것을 추천합니다.
제가 공부할 때에는 C와 Python이란 2가지의 언어를 주로 썼습니다.
-
C: 굉장히 저급 언어입니다. 포인터와 메모리 할당 및 해제를 직접 다루어서 데이터 구조와 알고리즘을 뼈 속 깊이 새겨둘 수 있게 됩니다. Python이나 Java와 같은 고급 언어들은 이런 걸 알아서 처리하기 때문에 가려져 있습니다. 이는 일상 업무를 할 때에는 아주 훌륭하지만 만약 저급 수준 데이터 구조가 어떻게 짜여져있는지 자체를 배우는 중이라면 c 언어를 사용해 기계와 가까워 지는 것이 더 좋습니다.
- C 언어는 어디에나 있습니다. 여러분은 공부하는 내내 이 사실을 깨닫게 될겁니다.
- The C Programming Language, Vol 2
- 이 책은 짧은 책이지만 여러분이 C 언어를 잘 다루게 만들어주고, 만약 조금씩 연습해본다면 더 빠르게 발전할 겁니다. C 언어를 이해하면 프로그램이 어떻게 돌아가고 메모리가 어떻게 작동하는지 이해하는데 도움을 줍니다.
- 여러분은 이 책을 깊게 파고들 필요는 없습니다(심지어 다 안 읽으셔도 됩니다). 그저 여러분이 C 언어를 읽고 쓰는 데에 익숙해질 정도면 됩니다.
- 이 책의 문제에 대한 정답들
-
Python: 현대적이고 굉장히 많은 것들을 할 수 있습니다. 저는 그냥 완전 유용하고 면접 때 써야할 코드를 줄여주기도 해서 배웠습니다.
이건 물론 제 취향일 뿐이고 여러분은 원하시는 걸 하시면 됩니다.
아마 필요없으실 수도 있지만, 새 언어를 배우기 위한 여러 사이트 주소들입니다.
면접에서는 여러분이 쓰기에 편한 언어를 사용해도 되지만, 대기업들은 보통 다음과 같은 정해진 언어들을 사용합니다:
- C++
- Java
- Python
아래 언어들을 사용할 수도 있지만 제대로 확인하셔야합니다. 주의사항이 있을 수도 있습니다:
- JavaScript
- Ruby
코딩 면접를 위한 언어를 선택하는 것과 관련하여 제가 쓴 글입니다: 코딩 면접을 위한 언어 선택하기 이 글은 제가 기반으로 사용한 원본 글입니다: http://blog.codingforinterviews.com/best-programming-language-jobs/
여러분은 여러분이 선택한 언어에 대해 매우 익숙하고 잘 알아야 합니다.
언어 선택에 도움이 될 만한 읽을 거리들
이 책들은 여러분의 컴퓨터 과학에 대한 기반을 다져줄 책들입니다.
그냥 아무거나 하나 여러분이 편한 언어와 관련된 것으로 선택하세요. 엄청나게 많은 책 읽기와 코딩을 하게 될 겁니다.
- Algorithms in C, Parts 1-5 (Bundle), 3rd Edition
- 기본적인 것들, 데이터 구조들, 정렬, 탐색, 그리고 그래프와 관련된 알고리즘 등이 들어있습니다.
- Data Structures and Algorithms in Python
- by Goodrich, Tamassia, Goldwasser
- 저는 이 책이 좋습니다. Python에 대한 모든 것과 부가적인 것을 다룹니다.
- Python적인 코드
- 저의 열렬한 서적 보고서: https://startupnextdoor.com/book-report-data-structures-and-algorithms-in-python/
여러분이 선택하세요:
- Goodrich, Tamassia, Goldwasser
- Sedgewick and Wayne:
- Algorithms
- 책의 내용을 가르쳐주는 무료 Cousera 강의 (저자가 가르쳐줍니다!):
여러분이 선택하세요:
- Goodrich, Tamassia, and Mount
- Sedgewick and Wayne
여러분은 이 책 뭉터기들을 다 살 필요는 없습니다. 솔직하게 말해서 "Cracking the Coding Interview"라는 책 하나면 충분합니다. 하지만 저는 더 준비해보기 위해 많이 사보았습니다. 결국 항상 너무 과했지만 말이죠.
저는 이 책을 둘 다 샀습니다. 굉장히 많은 걸 준비하게 해주었습니다.
- Programming Interviews Exposed: Coding Your Way Through the Interview, 4th Edition
- C++와 Java로 답변되어 있습니다.
- Cracking the Coding Interview 책을 위한 좋은 사전학습용 책입니다.
- 너무 어렵지 않습니다. 대부분의 문제가 여러분이 직접 겪게될 면접 문제보다 쉬울지도 모릅니다(제가 읽기로는)
- Cracking the Coding Interview, 6th Edition
- JAVA로 답변되어 있습니다.
하나를 선택하세요:
- Elements of Programming Interviews (C++ version)
- Elements of Programming Interviews in Python
- Elements of Programming Interviews (Java version) - Companion Project - Method Stub and Test Cases for Every Problem in the Book
이 문서는 많은 달에 걸쳐서 추가되고 있고, 맞습니다, 이미 제 손을 떠났습니다.
여기에 제가 저지른 몇 가지 실수들을 적어놓았으니 여러분은 참고하시고 더 나은 방향으로 나아가시길 바랍니다. 물론 몇 달의 시간도 절약하실 겁니다.
저는 수 시간의 비디오를 보고 방대한 양의 노트를 작성했지만, 몇 달 뒤에는 대부분의 내용을 기억하지 못했습니다. 저는 3일에 걸쳐 제가 작성한 노트를 보고 flashcard를 제작해서 복습할 수 있게 만들었습니다. 그 많은 지식들까지는 사실 필요 없었습니다.
꼭 읽고 제가 한 실수들을 반복하지 않길 바랍니다:
Retaining Computer Science Knowledge
이 문제를 해결하기 위해 2가지 종류(일반적인 내용, 코드)의 요약집을 보관하고 추가할 수 있는 조그만 사이트를 만들었습니다. 각 정리본은 다른 형식을 가지고 있습니다. 저는 모바일 우선인 웹사이트를 만들어서 제 휴대폰이나 태블릿 등 어디서나 볼 수 있게 했습니다.
여러분만의 요약집을 무료로 만들어봅시다:
제 요약집을 그대로 사용하시는 건 추천하지 않습니다. 거기엔 너무 많은 것들이 있고 대부분은 여러분이 필요하지 않은 것들뿐입니다.
하지만 제 말을 듣고 싶지 않은 청개구리 같은 분들을 위해, 주소는 남겨두겠습니다:
앞에서도 언급했듯이 저는 불필요하게 많은 것을 공부하려고 했고, 카드의 내용들은 어셈블리 언어와 Python의 자잘한 지식들부터 기계 학습과 통계학까지 넘나들게 되었습니다. 이건 필요한 것에서 엇나가도 너무 엇나간 겁니다.
flashcard에 대한 참고사항: 한 번 답을 맞췄다고 해서 안다고 표시하지 맙시다. 정확히 알기 전까지는 같은 카드를 보고 여러 번 맞추어 보아야합니다. 반복 학습은 그 지식을 뇌에 깊이 각인시켜 줄 겁니다.
제 사이트를 사용하는 대신 Anki를 사용해도 됩니다. 여러 번 추천받았던 사이트입니다. 이 사이트는 반복 시스템을 통해 여러분의 기억을 돕습니다. 사용자 친화적이며, 모든 플랫폼에서 사용 가능합니다. 또한 클라우드 동기화 시스템을 제공합니다. iOS에서는 2만 5천 원이지만 다른 플랫폼에서는 무료입니다.
Anki 형식의 내 요약집 데이터베이스: https://ankiweb.net/shared/info/25173560 (@xiewenya에게 감사의 말을 전합니다).
어떤 분들이 공백과 관련된 포맷팅 문제가 있다고 언급하셨는데 다음 방법으로 해결할 수 있습니다: open deck, edit card, click cards, select the "styling" radio button, add the member "white-space: pre;" to the card class.
굉장히 중요합니다!
코딩 면접 질문들을 여러분이 데이터 구조와 알고리즘을 배우는 동안에 봐두세요.
한 주제를 공부하고 충분히 익숙해졌다고 느낀다면(예를 들어 그것이 연결 리스트라면):
- 코딩 면접 책들이나 더 밑에서 다룰 코딩 문제 사이트들을 준비합니다.
- 연결 리스트에 관한 문제를 두세 문제 풀어봅니다.
- 다음 배울 주제로 넘어갑니다.
- 나중에, 다시 돌아와서 또 다른 두세 문제를 연결 리스트와 관련해서 풀어봅니다.
- 이를 새 내용을 배울 때마다 반복합니다.
반드시 여러분이 배우는 동안에 문제를 푸세요, 다 배우고 나서가 아니라.
여러분은 지식 자체가 필요해서 고용되는 것이 아니라 그 지식을 활용하기 위해서 고용되는 것입니다.
이를 위한 엄청나게 많은 자료들이 아래에 있습니다. 계속 합시다.
주의를 산만하게 만드는 많은 것들이 우리의 귀중한 시간을 뺏어갑니다. 주의를 집중하는 일은 물론 힘듭니다. 가사 없는 음악을 듣다보면 좀 더 쉽게 집중하실 수 있습니다.
이 기술들은 널리 퍼져 있는 기술이지만, 여기서 다루는 부분은 아닙니다:
- SQL
- Javascript
- HTML, CSS, 그리고 다른 프론트엔드 기술들
이 과정에는 엄청나게 많은 주제가 있습니다. 어떤 주제들은 며칠이 걸리거나 심지어 아마 일주일이나 그 이상이 걸릴지도 모릅니다. 여러분의 일정에 달려있습니다.
매일매일, 다음 주제로 넘어가면서, 주제에 관한 동영상들을 보고, 그리고 실제로 선택한 언어의 데이터 구조나 알고리즘을 구현하세요.
여기서 제 코드들을 볼 수 있습니다:
모든 알고리즘을 외울 필요는 없습니다. 그저 그걸 이해하고 나만의 방식으로 구현할 수 있으면 됩니다.
왜 이게 여기 있죠? 전 아직 면접볼 준비가 안되어 있는데요.
왜 프로그래밍 문제들을 풀면서 연습히야하는가:
- 문제 인식, 그리고 어디에 어떤 데이터 구조와 알고리즘을 썼어야했는지 알 수 있음
- 문제의 요구사항이 뭐였는지 이해할 수 있음
- 실제 면접처럼 자신만의 방식으로 문제를 설명할 수 있음
- 컴퓨터가 아니라 화이트보드나 종이에 코딩함
- 시간과 공간 복잡도를 함께 생각하게 됨(아래의 Big-O를 볼 것)
- 코드가 맞나 확인하게 됨
면접에서 방법론적인, 양방향 소통인 문제 해결에 대한 훌륭한 소개글이 있습니다. 물론 프로그래밍 면접 책들에서도 배울 수 있겠지만 이 글이 더 미친 수준이라 봅니다: Algorithm design canvas
컴퓨터가 아니라 화이트보드나 종이에 직접 코드를 적어보세요. 그리고 여기에 값들을 넣어보면서 테스트해보세요. 그리고는 컴퓨터에 코드를 치고 테스트해보세요.
만약 화이트보드가 집에 없다면, 문방구에 가서 그림용 공책을 사서 거기서 연습해보세요. 이건 제 "소파 화이트보드"입니다. 크기 비교를 위해 사진에 펜을 추가해봤습니다. 펜을 쓰신다면 몇 분 후 지워지지 않는 펜을 원망하는 자신을 보게 될 겁니다. 엄청 빨리 더러워집니다. 저는 그래서 연필과 지우개를 썼습니다.
코딩 문제 연습은 프로그래밍 문제에 대한 답을 외우는 연습이 아니다.
여기 있는 코딩 면접 책들을 잊지마세요.
문제 푸는 법들:
코딩 면접 질문 관련 동영상들:
- IDeserve (동영상 88개)
- Tushar Roy (플레이리스트 5개)
- Super for walkthroughs of problem solutions
- Nick White - 릿코드 해답 (동영상 187개)
- Good explanations of solution and the code
- You can watch several in a short time
- FisherCoder - 릿코드 해답
도전 사이트들:
- 릿코드
- My favorite coding problem site. It's worth the subscription money for the 1-2 months you'll likely be preparing.
- See Nick White and FisherCoder Videos above for code walk-throughs.
- 해커랭크
- 탑코더
- Geeks for Geeks
- InterviewBit
- Project Euler
네, 잡설은 그만하고, 배워봅시다!
하지만 위의 코딩 문제를 배우는 중에 같이 풀어보는 거 절대 잊지마세요!
- 구현할 것은 없다.
- 여기에는 다양한 영상들이 있다. 이해할 때까지 충분히 보고 언제든지 다시 돌아와서 복습할 수 있다.
- 일부 강의가 너무 수학적이라면, 아래로 가서 이산 수학에 대한 동영상을 보며 배경 지식을 쌓아보세요.
- Harvard CS50 - Asymptotic Notation (video)
- Big O Notations (general quick tutorial) (video)
- Big O Notation (and Omega and Theta) - best mathematical explanation (video)
- Skiena:
- A Gentle Introduction to Algorithm Complexity Analysis
- Orders of Growth (video)
- Asymptotics (video)
- UC Berkeley Big O (video)
- UC Berkeley Big Omega (video)
- Amortized Analysis (video)
- Illustrating "Big O" (video)
- TopCoder (includes recurrence relations and master theorem):
- Cheat sheet
- [Review] Analyzing Algorithms (playlist) in 18 minutes (video)
-
- 자동 리사이징 벡터 구현하기
- 설명:
- 벡터 구현하기 (자동 리사이징을 포함한 동적 배열):
- 배열, 포인터 및 인덱싱 대신하여 특정 인덱스에 접근하는 포인터 연산을 통한 코딩 연습
- 메모리 할당을 포함한 새 배열
- 배열 메소드 등의 기능을 활용하지 않으면서 정수 배열에 메모리를 할당할 수 있어야 함
- 16으로 시작하거나 시작하는 숫자가 크다면 2의 제곱수(16, 32, 64, 128)로 시작
- size() - 항목의 개수
- capacity() - 들어갈 수 있는 항목의 최대 개수
- is_empty()
- at(index) - 인덱스에 있는 항목을 돌려주고, 인덱스가 범위 밖이면 에러를 냄
- push(item)
- insert(index, item) - index에 item을 삽입하고 기존 인덱스의 값부터 쭉 오른쪽으로 쉬프트
- prepend(item) - 맨 앞에 원소를 삽입
- pop() - 마지막 원소를 삭제하고 값을 돌려준다
- delete(index) - delete item at index, shifting all trailing elements left
- remove(item) - looks for value and removes index holding it (even if in multiple places)
- find(item) - looks for value and returns first index with that value, -1 if not found
- resize(new_capacity) // private 함수
- 용량이 꽉 차면, 그 두배로 크기를 조정한다.
- item을 하나 꺼낼 때, 용량이 1/4이라면, 용량을 절반으로 줄인다.
- 시간 복잡도
- 접근, 수정, 끝에 추가/삭제하는 데 O(1)
- 다른 곳에 추가/삭제하는 데 O(n)
- 공간 복잡도
- 메모리에 연속적으로 있어서, 근접성이 성능을 향상시킨다.
- 필요한 공간 = (n 이상인 배열의 용량) * item의 크기, 하지만 2n 크기에서는 여전히 O(n)
-
- 설명:
- C Code (video) - 전체 영상은 아니고, 노드 구조와 메모리 할당에 대한 부분입니다.
- 연결 리스트 vs 배열:
- 왜 연결 리스트를 기피해야 하는지 (영상)
- 짚고가기: 이중 포인터에 대한 지식이 필요하다면: (for when you pass a pointer to a function that may change the address where that pointer points) 이 페이지는 포인터가 포인터를 가리키는 것을 파악하는 정도입니다. 저는 아래 목록을 순서대로 읽지 않기를 권장합니다. 가독성과 유지 보수성이 더 좋기 때문입니다.
- 구현 (저는 tail 포인터가 있는 것과 없는 것 모두 구현했었습니다.):
- size() - 리스트 안의 데이터 개수를 반환한다.
- empty() - 리스트가 비어있다면 true를 반환한다.
- value_at(index) - index번째 위치의 value을 반환한다. (가장 앞은 0부터 시작한다.)
- push_front(value) - 가장 앞에 value를 추가한다.
- pop_front() - 가장 앞에 있는 것을 제거하고, 그 value를 반환한다.
- push_back(value) - 가장 끝에 value을 추가한다.
- pop_back() - 가장 끝에 있는 것을 제거하고, 그 value를 반환한다.
- front() - 가장 앞에 있는 것의 value를 가져온다.
- back() - 가장 끝에 있는 것의 value를 가져온다.
- insert(index, value) - index번째 위치에 value를 추가한다. 즉, index번째에 새로 추가된 것이 기존의 index번째에 있던 것을 가리킨다.
- erase(index) - index번째에 있는 노드를 삭제한다.
- value_n_from_end(n) - 뒤에서부터 n번째에 있는 노드의 value를 반환한다.
- reverse() - 리스트를 뒤집는다.
- remove_value(value) - value와 같은 값을 가지는 첫 번째 노드를 제거한다.
- 이중 연결 리스트
- 설명 (영상)
- 구현할 필요는 없습니다.
-
- Stacks (video)
- [Review] Stacks in 3 minutes (video)
- Will not implement. Implementing with array is trivial.
-
- Queue (video)
- Circular buffer/FIFO05_04-priorityQueuesAndDeques.mp4)
- [Review] Queues in 3 minutes (video)
- tail 포인터가 있는 연결 리스트를 사용하여 구현하기:
- enqueue(value) - tail이 가리키는 곳에 value를 추가한다
- dequeue() - value를 반환하고 가장 최근에 추가된 원소(front)를 제거한다.
- empty()
- 고정 길이 배열을 사용하여 구현하기:
- enqueue(value) - 사용 가능한 저장 공간의 끝에 item을 추가한다.
- dequeue() - value를 반환하고 가장 최근에 추가된 원소를 제거한다.
- empty()
- full()
- 비용:
- a bad implementation using linked list where you enqueue at head and dequeue at tail would be O(n) because you'd need the next to last element, causing a full traversal each dequeue
- enqueue: O(1) (amortized, linked list and array [probing])
- dequeue: O(1) (linked list and array)
- empty: O(1) (linked list and array)
-
-
동영상들:
-
온라인 강의들:
-
Linear probing을 사용하여 배열로 구현해보기
- hash(k, m) - m은 해시 테이블의 크기
- add(key, value) - 키가 이미 존재한다면, 값을 갱신한다.
- exists(key)
- get(key)
- remove(key)
-
-
- Binary Search (video)
- Binary Search (video)
- 자세한 내용
- [Review] Binary search in 4 minutes (video)
- 구현:
- (정수가 정렬된 배열에서) 이진 탐색
- 재귀를 사용한 이진 탐색
-
- Bits cheat sheet - you should know many of the powers of 2 from (2^1 to 2^16 and 2^32)
- 비트 연산자(&, |, ^, ~, >>, <<) 제대로 이해하기
- 2의 보수와 1의 보수
- Count set bits
- Swap values:
- Absolute value:
-
- Series: Trees (video)
- 트리 기초 형태 만들기
- 순회
- 알고리즘 다루기
- BFS(너비-우선 탐색;breadth-first search) and DFS(깊이-우선 탐색;depth-first search)
- BFS 노트:
- level order (BFS, 큐를 사용하여)
- 시간 복잡도: O(n)
- 공간 복잡도: 최고: O(1) 최악: O(n/2)=O(n)
- DFS 노트:
- 시간 복잡도: O(n)
- 공간 복잡도: 최고: O(log n) - 평균적으로, 트리의 높이이다. 최악: O(n)
- 중위(inorder) (DFS: 왼쪽, 자신, 오른쪽)
- 후위(postorder) (DFS: 왼쪽, 오른쪽, 자신)
- 전위(preorder) (DFS: 자신, 왼쪽, 오른쪽)
- BFS 노트:
- [Review] Breadth-first search in 4 minutes (video)
- [Review] Depth-first search in 4 minutes (video)
- [Review] Tree Traversal (playlist) in 11 minutes (video)
-
- Binary Search Tree Review (video)
- Introduction (video)
- MIT (video)
- C/C++:
- 이진 탐색 트리 - C/C++로 구현하기 (영상)
- BST 구현 - 스택과 힙에 메모리 할당 (영상)
- 이진 탐색 트리에서 가장 작은 원소와 가장 큰 원소 찾기 (영상)
- 이진 트리의 높이 구하기 (영상)
- 이진 트리 순회 - 너비-우선과 깊이-우선 전략 (영상)
- 이진 트리: Level Order Traversal (video)
- 이진 트리 순회: 전위, 중위, 후위 (영상)
- 이진 트리가 이진 탐색 트리인지 아닌 지 확인하기 (영상)
- 이진 탐색 트리에서 노드 삭제하기 (영상)
- Inorder Successor in a binary search tree (video)
- 구현:
- insert // 트리에 어떤 값을 삽입
- get_node_count // 저장된 값들의 개수 세기
- print_values // 트리 안의 값들을 최소부터 최대까지 출력
- delete_tree
- is_in_tree // 주어진 값이 트리 안에 있는 지를 반환
- get_height // 어떤 노드의 높이를 반환 (노드 하나의 높이는 1이다.)
- get_min // 트리에 저장된 값 중 가장 작은 값을 반환
- get_max // 트리에 저장된 값 중 가장 큰 값을 반환
- is_binary_search_tree
- delete_value
- get_successor // 값이 주어지면, 다음으로 가장 큰 값을, 없으면 -1을 반환
-
- 트리처럼 보여지지만, 보통은 선형으로 저장됩니다. (배열, 링크드리스트처럼)
- 힙(Heap)
- 소개 (영상)
- Naive한 구현들 (영상)
- 이진 트리 (영상)
- Tree Height Remark (video)
- 기본 연산들 (영상)
- 완전 이진 트리 (영상)
- 의사 코드(Pseudocode) (영상)
- 힙 정렬 - 시작하기 (영상)
- 힙 정렬 (영상)
- 힙 만들기 (영상)
- MIT: 힙과 힙 정렬 (영상)
- CS 61B Lecture 24: 우선순위 큐 (영상)
- 선형 시간에 힙 만들기 (max-heap)
- [Review] Heap (playlist) in 13 minutes (video)
- max-heap 구현하기:
- insert
- sift_up -
insert
하려면 필요 - get_max - 최대 원소를 반환하되, 삭제는 하지 않는다.
- get_size() - 저장된 원소들의 개수를 반환
- is_empty() - 힙에 원소를 하나도 없는 지 반환
- extract_max - 최대 원소를 반환하고, 그걸 삭제한다.
- sift_down -
extract_max
하려면 필요하다 - remove(x) - x번째 원소를 삭제
- heapify - 배열에 있는 원소들로 힙을 만든다.
heap_sort
하려면 필요 - heap_sort() - 정렬되지 않은 배열을 받아서 정렬된 배열로 만든다. 추가 메모리 없이 제자리에서 max-heap을 사용한다.
- 노트: min-heap을 사용하면 연산을 줄일 수 있지만, 공간이 두 배로 필요합니다. (제자리에서 못 하기 때문에)
-
Notes:
- 정렬들 구현 & 각 정렬의 최적의 경우/최악의 경우, 평균적인 복잡도를 알기:
- 버블 소트 쓰지 마세요 - 끔찍하니까요 - n이 16이하 제외하고 O(n^2)
- 정렬 알고리즘들의 안정성 ("퀵소트는 안정적인가?")
- 어떤 알고리즘들에 연결 리스트를 쓸 수 있는가? 배열은? 둘 다는?
- 연결 리스트를 정렬하는 것은 추천하지 않지만, 병합 정렬은 가능합니다.
- 링크드 리스트로 병합 정렬
- 정렬들 구현 & 각 정렬의 최적의 경우/최악의 경우, 평균적인 복잡도를 알기:
-
힙소트의 경우, 위의 힙 데이터 구조를 보세요. 힙 정렬은 훌륭하지만 안정적이지 못합니다.
-
UC Berkeley:
-
병합 정렬 코드:
-
퀵 정렬 코드:
-
구현:
- 병합 정렬: 평균과 최악의 경우 O(n log n)
- 퀵 정렬: 평균적인 경우 O(n log n)
- 선택 정렬과 삽입 정렬은 둘 다 평균과 최악의 경우에 O(n^2)
- 힙 정렬의 경우, 위의 힙 데이터 구조를 보세요.
-
필요한 건 아니지만, 아래도 추천합니다:
개략적으로 보자면, 여기에 시각적으로 나타낸 15가지 정렬 알고리즘들을 보세요. 이 주제에 대해서 더 자세히 알고 싶다면, 몇몇 주제에 대한 세부사항에서 "정렬" 섹션를 보세요.
그래프는 컴퓨터 과학의 여러 문제들을 표현하는 데 사용할 수 있다. 때문에 이 섹션은 트리나 정렬 섹션처럼 길다.
-
노트:
- 메모리에 그래프를 표시하는 네 가지 기본 방법이 있다:
- 오브젝트와 포인터
- 행렬
- 인접 리스트
- 인접 맵
- 각각의 표현과 장단점을 숙지하라.
- 넓이 우선 탐색(BFS)와 깊이 우선 탐색(DFS) - 계산상의 복잡성, 장단점, 실제 코드로 구현하는 방법을 알아야 한다.
- 질문을 받을 시 먼저 그래프 기반 솔루션을 찾고, 없을 경우에 다른 솔루션으로 넘어가라.
- 메모리에 그래프를 표시하는 네 가지 기본 방법이 있다:
-
MIT(영상):
-
Skiena의 강좌 - 시작하기 아주 좋습니다:
- CSE373 2012 - Lecture 11 - Graph Data Structures (video)
- CSE373 2012 - Lecture 12 - Breadth-First Search (video)
- CSE373 2012 - Lecture 13 - Graph Algorithms (video)
- CSE373 2012 - Lecture 14 - Graph Algorithms (con't) (video)
- CSE373 2012 - Lecture 15 - Graph Algorithms (con't 2) (video)
- CSE373 2012 - Lecture 16 - Graph Algorithms (con't 3) (video)
-
그래프 (검토, 그 외 여러가지):
- 6.006 Single-Source Shortest Paths Problem (video)
- 6.006 Dijkstra (video)
- 6.006 Bellman-Ford (video)
- 6.006 Speeding Up Dijkstra (video)
- Aduni: Graph Algorithms I - Topological Sorting, Minimum Spanning Trees, Prim's Algorithm - Lecture 6 (video)
- Aduni: Graph Algorithms II - DFS, BFS, Kruskal's Algorithm, Union Find Data Structure - Lecture 7 (video)
- Aduni: Graph Algorithms III: Shortest Path - Lecture 8 (video)
- Aduni: Graph Alg. IV: Intro to geometric algorithms - Lecture 9 (video)
-
CS 61B 2014 (starting at 58:09) (video) - CS 61B 2014: Weighted graphs (video)
- Greedy Algorithms: Minimum Spanning Tree (video)
- Strongly Connected Components Kosaraju's Algorithm Graph Algorithm (video)
- [Review] Shortest Path Algorithms (playlist) in 16 minutes (video)
- [Review] Minimum Spanning Trees (playlist) in 4 minutes (video)
-
Full Coursera Course:
-
내가 구현할 것:
- DFS with 인접 리스트 (재귀)
- DFS with 인접 리스트 (스택을 쓴 비재귀)
- DFS with 인접 행렬 (재귀)
- DFS with 인접 행렬 (스택을 쓴 비재귀)
- BFS with 인접 리스트
- BFS with 인접 행렬
- 단일 출발지 최단 경로 (다익스트라)
- 최소 신장 트리 (MST;minimum spanning tree)
- DFS-기반 알고리즘들 (위의 Aduni 영상들을 보세요):
- 사이클 검사/확인 (위상 정렬할 때 필요합니다. 시작하기 전에 검사해야 하거든요.)
- 위상 정렬
- 그래프 내의 연결 요소(Connected Component)들 개수
- 강연결요소(SCC;Strongly Connected Component)들 나열하기
- 이분 그래프 확인하기
Skiena의 책(아래의 책 섹션 참조)과 인터뷰 책에서 더 많은 그래프 실습을 할 수 있습니다.
-
- 재귀와 백트래킹에 대한 스탠포드 대학 강의:
- 재귀는 언제 사용해야 하는 지
- 꼬리 재귀를 사용하는 게 그렇지 않은 것보다 얼마나 나은가요?
-
- 인터뷰에서 DP 문제를 접하지 않을 수도 있습니다. 하지만 알고 있는게 미뤄두는 것 보다 낫습니다.
- 이 주제는 아주 어렵습니다. DP로 풀리는 각 문제마다 어떤 점화식을 정의해야 하는데 그게 까다롭습니다.
- 얽혀있는 패턴들을 확실히 이해할 때까지, 많은 DP 예시 문제들을 찾아보기를 권합니다.
- Videos:
- Skiena씨의 영상들은 따라가기 힘듭니다. 가끔 화이트보드를 사용하시는 데 너무 작아서 보기가 힘들거든요.
- Skiena: CSE373 2012 - Lecture 19 - 동적 프로그래밍 소개 (영상)
- Skiena: CSE373 2012 - Lecture 20 - Edit Distance (video)
- Skiena: CSE373 2012 - Lecture 21 - 동적 프로그래밍 예제들 (영상)
- Skiena: CSE373 2012 - Lecture 22 - 동적 프로그래밍의 활용 (영상)
- Simonson: Dynamic Programming 0 (59:18부터 시작) (영상)
- Simonson: Dynamic Programming I - Lecture 11 (영상)
- Simonson: Dynamic programming II - Lecture 12 (영상)
- List of individual DP problems (each is short): Dynamic Programming (video)
- Yale Lecture notes:
- Coursera:
-
- Quick UML review (video)
- 아래 패턴들을 배워봅시다:
- strategy
- singleton
- adapter
- prototype
- decorator
- visitor
- factory, abstract factory
- facade
- observer
- proxy
- delegate
- command
- state
- memento
- iterator
- composite
- flyweight
- Chapter 6 (Part 1) - Patterns (video)
- Chapter 6 (Part 2) - Abstraction-Occurrence, General Hierarchy, Player-Role, Singleton, Observer, Delegation (video)
- Chapter 6 (Part 3) - Adapter, Facade, Immutable, Read-Only Interface, Proxy (video)
- Series of videos (27 videos)
- Head First Design Patterns
- I know the canonical book is "Design Patterns: Elements of Reusable Object-Oriented Software", but Head First is great for beginners to OO.
- Handy reference: 101 Design Patterns & Tips for Developers
- Design patterns for humans
-
- Math Skills: How to find Factorial, Permutation and Combination (Choose) (video)
- Make School: Probability (video)
- Make School: More Probability and Markov Chains (video)
- Khan Academy:
- Course layout:
- Just the videos - 41 (each are simple and each are short):
-
- Know about the most famous classes of NP-complete problems, such as traveling salesman and the knapsack problem, and be able to recognize them when an interviewer asks you them in disguise.
- Know what NP-complete means.
- Computational Complexity (video)
- Simonson:
- Skiena:
- Complexity: P, NP, NP-completeness, Reductions (video)
- Complexity: Approximation Algorithms (video)
- Complexity: Fixed-Parameter Algorithms (video)
- Peter Norvig discusses near-optimal solutions to traveling salesman problem:
- Pages 1048 - 1140 in CLRS if you have it.
-
- Computer Science 162 - Operating Systems (25 videos):
- for processes and threads see videos 1-11
- Operating Systems and System Programming (video)
- What Is The Difference Between A Process And A Thread?
- 알아 두어야 할 것:
- 프로세스, 쓰레드, 동시성 문제들
- 프로세스와 쓰레드의 차이점
- 프로세스
- 쓰레드
- 락(Locks)
- 뮤텍스(Mutexes)
- 세마포어(Semaphores)
- Monitors
- 각각이 어떻게 동작하는지?
- 데드락(Deadlock)
- 라이브락(Livelock)
- CPU activity, 인터럽트(interrupts), 문맥 교환(context switching)
- Modern concurrency constructs with multicore processors
- Paging, segmentation and virtual memory (video)
- Interrupts (video)
- Process resource needs (memory: code, static storage, stack, heap, and also file descriptors, i/o)
- Thread resource needs (shares above (minus stack) with other threads in the same process but each has its own pc, stack counter, registers, and stack)
- Forking is really copy on write (read-only) until the new process writes to memory, then it does a full copy.
- Context switching
- How context switching is initiated by the operating system and underlying hardware?
- 프로세스, 쓰레드, 동시성 문제들
- threads in C++ (series - 10 videos)
- CS 377 Spring '14: Operating Systems from University of Massachusetts
- concurrency in Python (videos):
- Computer Science 162 - Operating Systems (25 videos):
-
- 알아 두어야 할 것:
- 유닛 테스트는 어떻게 작동하는지
- mock object 는 무엇인지
- 통합 테스트는 무엇인지
- 의존성 주입은 무엇인지
- James Bach과 함께하는 애자일 소프트웨어 테스트 (비디오)
- 소프트웨어 테스트에 대한 James Bach의 무료 강의 (비디오)
- Steve Freeman - Test-Driven 개발 (이것은 우리가 의미하는 것은 아니다) (비디오)
- 의존성 주입:
- 테스트 어떻게 작성하는지
- 알아 두어야 할 것:
-
- 트라이에는 여러 종류가 있다는 것을 유의하라. 어떤 건 접두사가 있는 데, 어떤 건 그렇지 않고 또 어떤 것은 경로 추적을 위해 비트 대신에 문자열을 사용한다.
- 나는 코드만 읽었고, 구현은 안 했다.
- Sedgewick - Tries (3 videos)
- Notes on Data Structures and Programming Techniques
- Short course videos:
- The Trie: A Neglected Data Structure
- TopCoder - Using Tries
- Stanford Lecture (real world use case) (video)
- MIT, Advanced Data Structures, Strings (can get pretty obscure about halfway through)
-
- Big And Little Endian
- Big Endian Vs Little Endian (video)
- Big And Little Endian Inside/Out (video)
- Very technical talk for kernel devs. Don't worry if most is over your head.
- The first half is enough.
-
- 만약 당신이 네트워크에 대한 경험이 있거나 operations engineer 또는 믿음직한 엔지니어가 되고 싶다면 받을 수 있는 질문들
- 즉, 알면 좋은 것들이다.
- Khan Academy
- UDP and TCP: Comparison of Transport Protocols
- TCP/IP and the OSI Model Explained!
- Packet Transmission across the Internet. Networking & TCP/IP tutorial.
- HTTP
- SSL and HTTPS
- SSL/TLS
- HTTP 2.0
- Video Series (21 videos)
- Subnetting Demystified - Part 5 CIDR Notation
- 소켓:
- 4년 이상의 경력자라면 이런 시스템 디자인 질문들을 받을 수 있다.
- Scalability and System Design are very large topics with many topics and resources, since there is a lot to consider when designing a software/hardware system that can scale. Expect to spend quite a bit of time on this.
- 고려사항:
- scalability
- Distill large data sets to single values
- Transform one data set to another
- Handling obscenely large amounts of data
- system design
- features sets
- interfaces
- class hierarchies
- designing a system under certain constraints
- simplicity and robustness
- tradeoffs
- performance analysis and optimization
- scalability
- 여기서 시작하세요: The System Design Primer
- System Design from HiredInTech
- How Do I Prepare To Answer Design Questions In A Technical Inverview?
- 8 Things You Need to Know Before a System Design Interview
- Algorithm design
- Database Normalization - 1NF, 2NF, 3NF and 4NF (video)
- System Design Interview - 여기에 리소스가 정말 많이 있습니다. 글과 예제들을 살펴보세요. 일부는 아래에도 적어놓았습니다.
- How to ace a systems design interview
- Numbers Everyone Should Know
- How long does it take to make a context switch?
- Transactions Across Datacenters (video)
- A plain English introduction to CAP Theorem
- Consensus Algorithms:
- Consistent Hashing
- NoSQL Patterns
- Scalability:
- Great overview (video)
- Short series:
- Scalable Web Architecture and Distributed Systems
- Fallacies of Distributed Computing Explained
- Pragmatic Programming Techniques
- Jeff Dean - Building Software Systems At Google and Lessons Learned (video)
- Introduction to Architecting Systems for Scale
- Scaling mobile games to a global audience using App Engine and Cloud Datastore (video)
- How Google Does Planet-Scale Engineering for Planet-Scale Infra (video)
- The Importance of Algorithms
- Sharding
- Scale at Facebook (2009)
- Scale at Facebook (2012), "Building for a Billion Users" (video)
- Engineering for the Long Game - Astrid Atkinson Keynote(video)
- 7 Years Of YouTube Scalability Lessons In 30 Minutes
- How PayPal Scaled To Billions Of Transactions Daily Using Just 8VMs
- How to Remove Duplicates in Large Datasets
- A look inside Etsy's scale and engineering culture with Jon Cowie (video)
- What Led Amazon to its Own Microservices Architecture
- To Compress Or Not To Compress, That Was Uber's Question
- Asyncio Tarantool Queue, Get In The Queue
- When Should Approximate Query Processing Be Used?
- Google's Transition From Single Datacenter, To Failover, To A Native Multihomed Architecture
- Spanner
- Machine Learning Driven Programming: A New Programming For A New World
- The Image Optimization Technology That Serves Millions Of Requests Per Day
- A Patreon Architecture Short
- Tinder: How Does One Of The Largest Recommendation Engines Decide Who You'll See Next?
- Design Of A Modern Cache
- Live Video Streaming At Facebook Scale
- A Beginner's Guide To Scaling To 11 Million+ Users On Amazon's AWS
- How Does The Use Of Docker Effect Latency?
- A 360 Degree View Of The Entire Netflix Stack
- Latency Is Everywhere And It Costs You Sales - How To Crush It
- Serverless (very long, just need the gist)
- What Powers Instagram: Hundreds of Instances, Dozens of Technologies
- Cinchcast Architecture - Producing 1,500 Hours Of Audio Every Day
- Justin.Tv's Live Video Broadcasting Architecture
- Playfish's Social Gaming Architecture - 50 Million Monthly Users And Growing
- TripAdvisor Architecture - 40M Visitors, 200M Dynamic Page Views, 30TB Data
- PlentyOfFish Architecture
- Salesforce Architecture - How They Handle 1.3 Billion Transactions A Day
- ESPN's Architecture At Scale - Operating At 100,000 Duh Nuh Nuhs Per Second
- See "Messaging, Serialization, and Queueing Systems" way below for info on some of the technologies that can glue services together
- Twitter:
- For even more, see "Mining Massive Datasets" video series in the Video Series section.
- Practicing the system design process: Here are some ideas to try working through on paper, each with some documentation on how it was handled in the real world:
- review: The System Design Primer
- System Design from HiredInTech
- cheat sheet
- flow: 1. Understand the problem and scope: - define the use cases, with interviewer's help - suggest additional features - remove items that interviewer deems out of scope - assume high availability is required, add as a use case 2. Think about constraints: - ask how many requests per month - ask how many requests per second (they may volunteer it or make you do the math) - estimate reads vs. writes percentage - keep 80/20 rule in mind when estimating - how much data written per second - total storage required over 5 years - how much data read per second 3. Abstract design: - layers (service, data, caching) - infrastructure: load balancing, messaging - rough overview of any key algorithm that drives the service - consider bottlenecks and determine solutions
- Exercises:
이 섹션에는 중요한 개념들을 빠르게 검토할 수 있는 짧은 영상들이 포함되어 있다.
복습을 하고자 한다면, 이 영상들이 도움이 될 것이다.
- 2-3분 분량의 주제별 짧은 영상 시리즈 (23 videos)
- 2-5분 분량의 주제별 짧은 영상 시리즈 - Michael Sambol (48 videos):
- Sedgewick Videos - Algorithms I
- Sedgewick Videos - Algorithms II
이제 당신은 위의 컴퓨터 과학 주제들을 모두 알고 있으므로, 코딩 문제에 답하는 것을 연습할 차례이다.
코딩 문제 연습은 프로그래밍 문제에 대한 답을 외우는 것이 아니다.
당신에게 프로그래밍 문제를 푸는 연습이 필요한 이유:
- 문제 인식, 그리고 어떤 자료구조와 알고리즘이 언제 필요한지
- 문제의 조건을 모으기
- 인터뷰를 하듯 당신이 문제를 푸는 과정을 말하기
- 컴퓨터가 아닌 종이나 화이트보드에 코딩하기
- 당신의 풀이의 시간, 공간 복잡도를 제시하기
- 당신의 해답을 테스팅하기
체계적이고 소통하는 인터뷰에서의 문제풀이에 관한 좋은 시작점이 있다. 당신은 프로그래밍 인터뷰 책에서 이 서식을 얻을 수도 있지만, 나는 이 것이 가장 좋다고 본다: Algorithm design canvas
집에 화이트보드가 없는가? 그럴 수 있다. 나는 커다란 화이트보드를 가진 괴짜이다. 화이트보드 대신에 상점에서 큰 도화지를 사오자. 소파에 앉아서 연습할 수 있다. 이 것은 내 "소파 화이트보드"이다. 크기 비교를 위해 사진에 펜을 추가하였다. 펜을 쓰면, 곧 지우고 싶어질 것이다. 금방 지저분해 진다.
보충:
읽고 프로그래밍 문제 풀기 (순서대로):
- Programming Interviews Exposed: Secrets to Landing Your Next Job, 2nd Edition
- C, C++, Java로 답변
- Cracking the Coding Interview, 6th Edition
- Java로 답변
위의 도서 목록을 보세요.
공부하는 게 머리에 잘 안 들어올 때, 한번 해보세요. 가능한 한 매일 코딩 챌린지를 하는겁니다.
코딩 인터뷰 질문들 영상:
- IDeserve (88 videos)
- Tushar Roy (5 playlists)
- Nick White - LeetCode Solutions (187 Videos)
- Good explanations of solution and the code.
- You can watch several in a short time.
- FisherCoder - LeetCode Solutions
Challenge sites:
- LeetCode
- My favorite coding problem site. It's worth the subscription money for the 1-2 months you'll likely be preparing.
- LeetCode solutions from FisherCoder
- See Nick White Videos above for short code-throughs
- HackerRank
- TopCoder
- InterviewCake
- Geeks for Geeks
- InterviewBit
- Project Euler (math-focused)
- Code Exercises
Language-learning sites, with challenges:
Challenge repos:
모의 면접:
- Gainlo.co: Mock interviewers from big companies - I used this and it helped me relax for the phone screen and on-site interview.
- Pramp: Mock interviews from/with peers - peer-to-peer model of practice interviews
- Refdash: Mock interviews and expedited interviews - also help candidates fast track by skipping multiple interviews with tech companies.
- interviewing.io: Practice mock interview with senior engineers - anonymous algorithmic/systems design interviews with senior engineers from FAANG anonymously.
- Cracking The Coding Interview Set 2 (videos):
- See Resume prep items in Cracking The Coding Interview and back of Programming Interviews Exposed
아래의 아이템들에 따른 너가 받을 20개의 인터뷰 질문에 대해 생각하라. 각각 2-3개의 대답을 준비해라. 당신이 성취한 것에 대해 데이터 뿐만 아니라 스토리를 만들어라.
- 왜 이 직업을 원합니까?
- 당신이 풀었던 문제 중 힘들었던 문제는?
- 큰 도전에 직면한 적은?
- 최고의/최악의 디자인을 본 적이 있는가?
- 현존하는 제품을 향상시킬 수 있는 아이디어
- 개인적으로 일할 때 가장 잘 일 하는가? 아니면 팀원으로서 있을 때?
- 어떤 기술과 경험들이 당신의 역할에서 자산이 되었으며 그 이유는?
- 어떤 것이 가장 즐거웠는가 [job x / project y]?
- 무엇이 가장 큰 도전이었는가 [job x / project y]?
- 무엇이 가장 힘들었던 버그였는가? [job x / project y]?
- 무엇을 배웠는가 [job x / project y]?
- 무엇이 향상되었는가 [job x / project y]?
내 경우에는 이랬다. (I already may know answer to but want their opinion or team perspective):
- 얼마나 큰 팀에 있었나요?
- 당신의 개발 사이클은 어떤 모습인가요? 폭포수(워터폴)/스프린트/애자일인가요?
- 보통 마감까지 달리시는 편인가요? 아니면 여유롭게 하시는 편인가요?
- 팀 내에서 의사 결정은 어떻게 하나요?
- 당신은 한 주에 미팅을 얼마나 한다고 생각하나요?
- 업무 환경이 집중력에 도움이 된다고 생각하나요?
- 지금은 어떤 일을 하고 계신가요?
- What do you like about it?
- 어떤 Work life를 생각하시나요?
- 워라밸은 어떤게 좋나요?
축하드립니다!
꾸준히 공부하시길 바랍니다.
끝난게 아니니까요.
*****************************************************************************************************
*****************************************************************************************************
아래의 모든 것들은 선택 사항이다.
당신은 이것들을 공부함으로써 더 많은 CS 개념들에 대해 알 수 있을 것이며, 소프트웨어 엔지니어링 직업을 준비하는 데에도 도움이 될 것
이다. 더불어 당신은 훨씬 더 균형 잡힌 소프트웨어 엔지니어가 될 것이다.
*****************************************************************************************************
*****************************************************************************************************
아래는 당신이 흥미로워하는 주제에 대해 공부할 수 있는 자료들입니다.
-
The Unix Programming Environment
- an oldie but a goodie
-
The Linux Command Line: A Complete Introduction
- a modern option
-
- a gentle introduction to design patterns
-
Design Patterns: Elements of Reusable Object-Oriented Software
- aka the "Gang Of Four" book, or GOF
- the canonical design patterns book
-
Algorithm Design Manual (Skiena)
- As a review and problem recognition
- The algorithm catalog portion is well beyond the scope of difficulty you'll get in an interview.
- This book has 2 parts:
- class textbook on data structures and algorithms
- pros:
- is a good review as any algorithms textbook would be
- nice stories from his experiences solving problems in industry and academia
- code examples in C
- cons:
- can be as dense or impenetrable as CLRS, and in some cases, CLRS may be a better alternative for some subjects
- chapters 7, 8, 9 can be painful to try to follow, as some items are not explained well or require more brain than I have
- don't get me wrong: I like Skiena, his teaching style, and mannerisms, but I may not be Stony Brook material.
- pros:
- algorithm catalog:
- this is the real reason you buy this book.
- about to get to this part. Will update here once I've made my way through it.
- class textbook on data structures and algorithms
- Can rent it on kindle
- Answers:
- Errata
-
Write Great Code: Volume 1: Understanding the Machine
- The book was published in 2004, and is somewhat outdated, but it's a terrific resource for understanding a computer in brief.
- The author invented HLA, so take mentions and examples in HLA with a grain of salt. Not widely used, but decent examples of what assembly looks like.
- These chapters are worth the read to give you a nice foundation:
- Chapter 2 - Numeric Representation
- Chapter 3 - Binary Arithmetic and Bit Operations
- Chapter 4 - Floating-Point Representation
- Chapter 5 - Character Representation
- Chapter 6 - Memory Organization and Access
- Chapter 7 - Composite Data Types and Memory Objects
- Chapter 9 - CPU Architecture
- Chapter 10 - Instruction Set Architecture
- Chapter 11 - Memory Architecture and Organization
-
- Important: Reading this book will only have limited value. This book is a great review of algorithms and data structures, but won't teach you how to write good code. You have to be able to code a decent solution efficiently.
- aka CLR, sometimes CLRS, because Stein was late to the game
-
Computer Architecture, Sixth Edition: A Quantitative Approach
- For a richer, more up-to-date (2017), but longer treatment
-
- The first couple of chapters present clever solutions to programming problems (some very old using data tape) but that is just an intro. This a guidebook on program design and architecture.
두루 갖춘 소프트웨어 엔지니어가 되는데 도움이 될만한 것들을 추가했습니다. 이를 통해 더 큰 도구들을 다루실 수 있게 되실 겁니다.
-
- Familiarize yourself with a unix-based code editor
- vi(m):
- emacs:
-
- Khan Academy
- More about Markov processes:
- See more in MIT 6.050J Information and Entropy series below.
-
- Intro
- Parity
- Hamming Code:
- Error Checking
-
- also see videos below
- make sure to watch information theory videos first
- Information Theory, Claude Shannon, Entropy, Redundancy, Data Compression & Bits (video)
-
- also see videos below
- make sure to watch information theory videos first
- Khan Academy Series
- Cryptography: Hash Functions
- Cryptography: Encryption
-
- make sure to watch information theory videos first
- Computerphile (videos):
- Compressor Head videos
- (optional) Google Developers Live: GZIP is not enough!
-
- Given a Bloom filter with m bits and k hashing functions, both insertion and membership testing are O(k)
- Bloom Filters
- Bloom Filters | Mining of Massive Datasets | Stanford University
- Tutorial
- How To Write A Bloom Filter App
-
- used to determine the similarity of documents
- the opposite of MD5 or SHA which are used to determine if 2 documents/strings are exactly the same.
- Simhashing (hopefully) made simple
-
-
적어도 하나의 타입의 균형 이진 트리에 대하여 알고 계시는 게 좋습니다 (그리고 어떻게 적용되는지까지요):
-
"Among balanced search trees, AVL and 2/3 trees are now passé, and red-black trees seem to be more popular. A particularly interesting self-organizing data structure is the splay tree, which uses rotations to move any accessed key to the root." - Skiena
-
Of these, I chose to implement a splay tree. From what I've read, you won't implement a balanced search tree in your interview. But I wanted exposure to coding one up and let's face it, splay trees are the bee's knees. I did read a lot of red-black tree code.
- splay tree: insert, search, delete functions If you end up implementing red/black tree try just these:
- search and insertion functions, skipping delete
-
I want to learn more about B-Tree since it's used so widely with very large data sets.
-
AVL trees
- In practice: From what I can tell, these aren't used much in practice, but I could see where they would be: The AVL tree is another structure supporting O(log n) search, insertion, and removal. It is more rigidly balanced than red–black trees, leading to slower insertion and removal but faster retrieval. This makes it attractive for data structures that may be built once and loaded without reconstruction, such as language dictionaries (or program dictionaries, such as the opcodes of an assembler or interpreter).
- MIT AVL Trees / AVL Sort (video)
- AVL Trees (video)
- AVL Tree Implementation (video)
- Split And Merge
- [Review] AVL Trees (playlist) in 19 minutes (video)
-
Splay trees
- In practice: Splay trees are typically used in the implementation of caches, memory allocators, routers, garbage collectors, data compression, ropes (replacement of string used for long text strings), in Windows NT (in the virtual memory, networking and file system code) etc.
- CS 61B: Splay Trees (video)
- MIT Lecture: Splay Trees:
- Gets very mathy, but watch the last 10 minutes for sure.
- Video
-
Red/black trees
- these are a translation of a 2-3 tree (see below)
- In practice: Red–black trees offer worst-case guarantees for insertion time, deletion time, and search time. Not only does this make them valuable in time-sensitive applications such as real-time applications, but it makes them valuable building blocks in other data structures which provide worst-case guarantees; for example, many data structures used in computational geometry can be based on red–black trees, and the Completely Fair Scheduler used in current Linux kernels uses red–black trees. In the version 8 of Java, the Collection HashMap has been modified such that instead of using a LinkedList to store identical elements with poor hashcodes, a Red-Black tree is used.
- Aduni - Algorithms - Lecture 4 (link jumps to starting point) (video)
- Aduni - Algorithms - Lecture 5 (video)
- Red-Black Tree
- An Introduction To Binary Search And Red Black Tree
- [Review] Red-Black Trees (playlist) in 30 minutes (video)
-
2-3 search trees
- In practice: 2-3 trees have faster inserts at the expense of slower searches (since height is more compared to AVL trees).
- You would use 2-3 tree very rarely because its implementation involves different types of nodes. Instead, people use Red Black trees.
- 23-Tree Intuition and Definition (video)
- Binary View of 23-Tree
- 2-3 Trees (student recitation) (video)
-
2-3-4 Trees (aka 2-4 trees)
- In practice: For every 2-4 tree, there are corresponding red–black trees with data elements in the same order. The insertion and deletion operations on 2-4 trees are also equivalent to color-flipping and rotations in red–black trees. This makes 2-4 trees an important tool for understanding the logic behind red–black trees, and this is why many introductory algorithm texts introduce 2-4 trees just before red–black trees, even though 2-4 trees are not often used in practice.
- CS 61B Lecture 26: Balanced Search Trees (video)
- Bottom Up 234-Trees (video)
- Top Down 234-Trees (video)
-
N-ary (K-ary, M-ary) trees
- note: the N or K is the branching factor (max branches)
- binary trees are a 2-ary tree, with branching factor = 2
- 2-3 trees are 3-ary
- K-Ary Tree
-
B-Trees
- 재밌는 사실: it's a mystery, but the B could stand for Boeing, Balanced, or Bayer (co-inventor)
- In Practice: B-트리는 데이터베이스에 광범위하게 사용됩니다. 가장 현대적인 파일시스템은 B-트리를 씁니다 (or Variants). 데이터베이스에 사용될 뿐만 아니라, B-트리는 특정한 파일의 임의의 블록에 '빠른 무작위 탐색'을 가능하게 합니다. 기본적인 문제는 파일블록 주소 i를 하나의 디스크 블록(또는 아마도 실린더-헤드-섹터) 주소로 바꾸는 것입니다.
- B-Tree
- B-Tree Definition and Insertion (video)
- Introduction to B-Trees (video)
- B-Tree Deletion (video)
- MIT 6.851 - Memory Hierarchy Models (video) - covers cache-oblivious B-Trees, very interesting data structures - the first 37 minutes are very technical, may be skipped (B is block size, cache line size)
- [Review] B-Trees (playlist) in 26 minutes (video)
-
-
- great for finding number of points in a rectangle or higher dimension object
- a good fit for k-nearest neighbors
- Kd Trees (video)
- kNN K-d tree algorithm (video)
-
- "These are somewhat of a cult data structure" - Skiena
- Randomization: Skip Lists (video)
- For animations and a little more detail
-
- Combination of a binary search tree and a heap
- Treap
- Data Structures: Treaps explained (video)
- Applications in set operations
-
- 아래에 있는 영상을 확인하세요.
-
- 왜 기계학습이 중요하죠?
- Google's Cloud Machine learning tools (video)
- Google Developers' Machine Learning Recipes (Scikit Learn & Tensorflow) (video)
- Tensorflow (video)
- Tensorflow Tutorials
- Practical Guide to implementing Neural Networks in Python (using Theano)
- 강의들:
- Great starter course: Machine Learning - videos only - see videos 12-18 for a review of linear algebra (14 and 15 are duplicates)
- Neural Networks for Machine Learning
- Google's Deep Learning Nanodegree
- Google/Kaggle Machine Learning Engineer Nanodegree
- Self-Driving Car Engineer Nanodegree
- 자료들:
이미 언급한 몇몇의 개념에 대한 설명을 좀 더 보강하기 위해서 적었습니다.
하지만 더하길 원하지 않았어요. 왜냐면 그 양이 너무나 방대하기 때문이지요.
하나의 주제에 대하여 지나치게 깊게 파고드는 것은 쉬운 일입니다.
이번 세기에 직장을 구하고 싶으시잖아요, 맞죠?
-
SOLID
- Bob Martin SOLID Principles of Object Oriented and Agile Design (video)
- S - Single Responsibility Principle | Single responsibility to each Object
- O - Open/Closed Principal | On production level Objects are ready for extension but not for modification
- L - Liskov Substitution Principal | Base Class and Derived class follow ‘IS A’ principal
- I - Interface segregation principle | clients should not be forced to implement interfaces they don't use
- D -Dependency Inversion principle | Reduce the dependency In composition of objects.
-
Union-Find
-
More Dynamic Programming (videos)
- 6.006: Dynamic Programming I: Fibonacci, Shortest Paths
- 6.006: Dynamic Programming II: Text Justification, Blackjack
- 6.006: DP III: Parenthesization, Edit Distance, Knapsack
- 6.006: DP IV: Guitar Fingering, Tetris, Super Mario Bros.
- 6.046: Dynamic Programming & Advanced DP
- 6.046: Dynamic Programming: All-Pairs Shortest Paths
- 6.046: Dynamic Programming (student recitation)
-
Advanced Graph Processing (videos)
-
MIT Probability (mathy, and go slowly, which is good for mathy things) (videos):
-
**문자열 매칭
- 라빈-카프(Rabin-Karp) (동영상):
- Knuth-Morris-Pratt (KMP):
- 보이어-무어(Boyer–Moore) 문자열 검색 알고리즘
- Coursera: Algorithms on Strings
- starts off great, but by the time it gets past KMP it gets more complicated than it needs to be
- 트라이(tries)에 대해서 잘 설명하고 있다.
- 이건 생략 가능
-
정렬
- 스탠포드 대학의 정렬 강의들:
- Shai Simonson, Aduni.org:
- Steven Skiena lectures on sorting:
편하게 보세요. "Netflix and skill"이라니까요 :P
-
List of individual Dynamic Programming problems (each is short)
-
Excellent - MIT Calculus Revisited: Single Variable Calculus
-
Computer Science 70, 001 - Spring 2015 - Discrete Mathematics and Probability Theory
-
CSE373 - Analysis of Algorithms (25 videos)
-
UC Berkeley CS 152: Computer Architecture and Engineering (20 videos) -
Carnegie Mellon - Computer Architecture Lectures (39 videos)
-
MIT 6.042J: Mathematics for Computer Science, Fall 2010 (25 videos)
-
MIT 6.050J: Information and Entropy, Spring 2008 (19 videos)
- Love classic papers?
- 1978: Communicating Sequential Processes
- 2003: The Google File System
- replaced by Colossus in 2012
- 2004: MapReduce: Simplified Data Processing on Large Clusters
- mostly replaced by Cloud Dataflow?
- 2006: Bigtable: A Distributed Storage System for Structured Data
- 2006: The Chubby Lock Service for Loosely-Coupled Distributed Systems
- 2007: Dynamo: Amazon’s Highly Available Key-value Store
- The Dynamo paper kicked off the NoSQL revolution
- 2007: What Every Programmer Should Know About Memory (very long, and the author encourages skipping of some sections)
- 2010: Dapper, a Large-Scale Distributed Systems Tracing Infrastructure
- 2010: Dremel: Interactive Analysis of Web-Scale Datasets
- 2012: Google's Colossus
- paper not available
- 2012: AddressSanitizer: A Fast Address Sanity Checker:
- 2013: Spanner: Google’s Globally-Distributed Database:
- 2014: Machine Learning: The High-Interest Credit Card of Technical Debt
- 2015: Continuous Pipelines at Google
- 2015: High-Availability at Massive Scale: Building Google’s Data Infrastructure for Ads
- 2015: TensorFlow: Large-Scale Machine Learning on Heterogeneous Distributed Systems
- 2015: How Developers Search for Code: A Case Study
- 2016: Borg, Omega, and Kubernetes