개발자 커뮤니티 글또의 도움을 받아, 우연한 기회로 유데미 알고리즘 강의를 후원받아 수강하게 되었다.
수강하게 된 계기
프론트엔드 개발자로서 3년 가량 실무에서만 일을 하다 보니, 자연스레 자료구조나 알고리즘에 대한 감을 완전히(..!) 잃어버리게 되고 말았다. 알고리즘은 비록 실무에서 자주 쓰이는 분야는 아니지만, 개발자로서의 커리어, 특히 취업과 이직을 위해서는 필수적으로 요구되는 지식인 만큼 주기적으로 연습을 해둘 필요가 있다. 당장 취업을 해야 하는 상황이 아닐지라도, 연차가 쌓일수록 동료들의 채용과 면접 과정에 참여하게 되는 경우도 생기기 때문에 코딩테스트 준비는 해놔서 나쁠 게 없다고 판단했다. 약점이기만 했던 알고리즘을 보완하기 위해 좋은 기회로 JavaScript 알고리즘 & 자료구조 마스터클래스 강의를 수강하게 되었고, 문제를 정의하고 논리적으로 풀어나가는 훈련을 하는 데 도움이 될 것이라고도 기대하고 있다. 학습했던 주요 내용은 다음과 같다.
좋은 코드란 무엇인가
알고리즘 관점에서 더 나은 코드란 무엇인가에 대한 기본적인 관점을 알려준다. 빅오 표기법을 사용하여 시간복잡도, 공간복잡도를 분석하는 방법을 알아보고, 자주 사용되는 자료구조(배열 vs 객체)를 기준으로 각종 메서드들의 시간복잡도를 측정해보았다.
문제를 해결하기 위한 접근법
어려운 문제가 주어졌을 때, 효율적으로 푸는 단계적 접근법을 학습하였다. 이를 기반으로 빈도 수 세기, 애너그램, 다중포인터 등 여러 유형의 문제들을 직접 먼저 풀어본 뒤, 강사님의 해결방법을 비교해가며 알고리즘 문제를 해결하는 과정에 대한 감을 키울 수 있었다. 단순히 구현을 넘어 시간복잡도를 고려한 효율성을 생각하는 훈련을 도와준다.
재귀 & 검색 알고리즘
가장 인기있는 재귀, 검색 알고리즘을 많은 문제들을 풀어보며 집중적으로 구현해보았다. 팩토리얼, 선형 검색, 이진 검색, 문자열 검색 등 가장 흔하게 등장하는 개념들을 학습하고 스스로 풀어보면서, 본격적으로 알고리즘 문제를 푸는 재미를 키워나갈 수 있었다.
정렬 알고리즘
정렬은 꽤나 비싼 연산이다. 이를 최적화하기 위한 버블, 선택, 삽입, 퀵, 합병, 기수 정렬 등 소팅(Sorting)과 관련된 대부분의 알고리즘을 하나씩 다뤄볼 수 있었다. 각각의 시간복잡도와 함께 어떤 시나리오에서 어떤 정렬 알고리즘을 쓰는 것이 적합한가에 대해 비교도 해볼 수 있다. 이 정도까지만 심도있게 연습해놓는다면 코딩테스트를 보는 기업에 지원하는 데 얼추 자신감이 붙게 될 것이다.
자주 사용되는 자료구조
단일 연결 리스트, 이중 연결 리스트, 스택, 큐, 트리, 힙, 해시 테이블, 그래프 등 알고리즘에 필요한 주요 자료구조들을 학습했다. 알고리즘에서도 중요한 개념들이지만, 기술 면접에서도 자주 등장하는 내용이므로 반드시 알아둬야 한다.
강의를 듣고 나서
항상 약점이라고 생각했던 알고리즘을 기본적인 개념부터 차근차근 쌓아나갈 수 있었던 계기가 되었다. 아직 고급 알고리즘을 자유롭게 다루진 못하지만 (ex. 강의 후반에 나오는 다익스트라 알고리즘, 다이나믹 프로그래밍 등) 절대적인 양적 학습이 동반된다면 쉽게 극복할 수 있는 산이라는 자신감이 붙었다. 또한 코딩 테스트를 준비하기 위한 책이나 강의들은 대부분 파이썬, C++, Java 등 내 주력이 아닌 언어를 기준으로 만들어져 있었기 때문에 새로운 언어를 익혀야 한다는 부담이 있었는데, 본 강의는 프론트엔드 개발자들의 메인 언어인 자바스크립트를 기준으로 만들어져있었기 때문에 더욱 효과적으로 알고리즘을 배울 수 있어 좋았다.
추천 대상
자료구조와 알고리즘에 대한 기본기가 부족한 개발자, 그리고 JavaScript로 된 코딩테스트에 대한 니즈가 있는 프론트엔드 개발자에게 특히 추천한다. 강의도 전반적으로 지루하지 않고, 알고리즘 문제를 푸는 재미를 느낄 수 있게 구성되어 있어 PS에 익숙하지 않은 초심자에게도 감을 키울 수 있는 좋은 계기가 될 것이다. 다만 알고리즘에 필요한 대부분의 개념들을 다루는 관계로 강의 호흡이 긴 편으로, 빠르게 코딩테스트를 대비해야 한다면 부족한 개념을 다루는 챕터들만 골라 들을 필요가 있을 수도 있겠다.
강의 링크