평소 알고리즘을 어떻게 공부하고 있나요? 냅다 문제만 풀고 있진 않나요?
특히, 알고리즘과 자료구조 공부를 제대로 시작하고자 하는 분들께 이 책을 추천합니다.
그동안의 알고리즘 공부 방식
문제만 냅다 풀기
보통 개발자 취업을 앞둔 신입 개발자 혹은 이직을 준비하는 경력 개발자 대다수라면, 프로그래머스나 백준 등 플랫폼에서 알고리즘 문제를 풀 것이다. 물론 차근차근 이론부터 공부하면서 문제를 푸는 것도 좋지만 시간상 공부를 하면서 문제에 익숙해지기는 어렵기도 하다.
필자 또한 그랬다. 일단 코딩 테스트에 대비해 알고리즘 문제를 냅다 풀었다. 유형 파악도 못한 채로 말이다. 문제를 계속 풀다보면 유형 파악이 어느정도 된다고는 하지만, 여전히 추상적이라고 느껴졌다. 문제를 딱 보면 ‘어떤 알고리즘이다’ 라는 감이 올 줄 알았는데. 생각보다 그렇지 않았다.
뭐가 부족한 것일까
문제 풀이 개수가 모자라서 문제를 더 많이 풀어봤고, 유형별로 다루는 강의도 들어봤지만 별로 효과가 없었던 것 같다. 급할수록 돌아가라는 말도 있지 않나. 기초부터 탄탄히 다지기로 결심했다. 그래서 <그림으로 이해하는 알고리즘> 이라는 책을 읽어보았다.
이 책을 선택한 이유
어려운건 쉽게 공부해야 한다
최근 <그림으로 쉽게 이해하는 웹/HTTP/네트워크> 이라는 책을 읽은 적이 있다. 평소 이해하기 어려웠던 네트워크 개념을 일상에서 쉽게 접할 수 있는 레스토랑, 택배 등으로 비유하고, 귀여운 그림과 함께 설명한 책이다. 이 책을 읽으면서 어려운 개념을 이렇게 쉽게 설명할 수 있구나 새삼 저자가 대단하다고 느꼈다. 네트워크에 대해 이해는 물론이고, 재미를 느껴서 2회독을 했을 정도다.
책의 일부 (출처: Yes24)
이번에 읽은 <그림으로 이해하는 알고리즘> 도 같은 이유로 선택했다. 평소 노트에 그림을 그리고, 유튜브 영상들을 봐도 잘 이해가 되지 않는 알고리즘 개념들을 그림으로 쉽게 설명해주고 강의 값의 절반도 안되는 비용으로 웬만한 알고리즘을 섭렵할 수 있어 좋았다.
책의 일부 (출처: Yes24)
명명된 것은 분명 유래가 있다
중요한 역사적 사건이나 수학적 원리는 이름이 생긴다. (예를 들면 피타고라스의 정리 같은..) 알고리즘 또한 마찬가지라고 생각한다. 많은 알고리즘이 특정한 사람의 이름을 따서 명명되거나, 발견된 원리와 방법에 의해 이름이 붙여진다.
알고리즘 또한 실제 코드에, 그리고 그 코드가 곧 현실 세계의 문제를 해결한다. 때문에 이름이 붙여지고 널리 알려지는 것이라 생각한다.
예를 들면 무엇이 있을까?
알고리즘이 적용된 현실 사례
예를 들어, ‘다익스트라 알고리즘’은 현실 세계에서 어떻게 쓰일까? 다익스트라 알고리즘은 간단히 말해 가중치가 있는 그래프에서 특정 노드에서 다른 모든 노드까지의 최단 경로를 찾는 방법을 제공한다.
다익스트라 알고리즘은 도로 네트워크를 그래프로 모델링한 후, 특정 위치에서 목적지까지의 최단 경로를 찾는 데 사용된다. 예를 들어, 네이버 지도나 구글 맵에서 출발지와 도착지를 입력했을 때 최단 경로를 찾는 방식이 다익스트라 알고리즘에 기반할 수 있다.
또는 물류 업체들이 효율적인 배송 경로를 찾기 위해서도 다익스트라 알고리즘을 사용할 수 있다. 특정 허브에서 각 배송지까지 최단 시간, 최단 거리 또는 최저 비용으로 이동할 수 있는 경로를 찾는 데 유용하다.
만약 지도 서비스나 물류 서비스를 개발하는 개발자라면, 다익스트라 알고리즘을 기본적으로 알고 있어야 할 것이다.
물론 코딩 테스트 대비
최근 시니어 개발자 분과 알고리즘 스터디를 함께 할 기회가 있었다. 짧은 시간이었지만 아래와 같이 느낀 게 참 많았다.
1.
사소한 것이 성능에 꽤 큰 영향을 미칠 수 있구나
2.
(스터디원들의 풀이를 보고) 나는 생각없이 문제를 푸는 편이구나 ㅎ
3.
시간복잡도와 성능을 더 고려해 풀어야겠다. 처음에 그렇게 풀지 못하더라도 계속해서 더 효율적인 풀이를 찾아야겠다.
4.
역시 시니어는 시니어구나
5.
풀고만 끝내는 게 아니라 최적화 등 더 좋은 풀이를 고민해 와야겠다
6.
이래서 잘하는 사람, 열심히 하는 사람들과 함께해야 하는구나
7.
다른 사람들 풀이를 보면서 TC와 SC를 계산해 봐야겠다
8.
각 내장함수 복잡도도 알아둬야겠다
9.
하루 몇 문제를 한꺼번에 풀지말고 매일 한 문제씩 풀어야겠다. 그래야 매일 책상 앞에 앉을 수 있을듯
10.
각 구현의 복잡도를 설명할 수 있어야 인터뷰에서 대응이 가능하겠다. "복잡도가 ~~ 이기 때문에 이렇게 구현했습니다" 라고.
11.
"우리 회사에 이 사람이 들어온다면 이렇게 코드를 짜겠구나" 하는 시각으로 풀어야겠다. 그러니 성능에 악영향을 미치는 코드, 변수명과 함수명이 충분히 직관적인지 생각하며 풀어야겠다.
12.
아직 갈 길이 멀었지만 이 gap을 느끼고 채울 수 있는 스터디임에 감사
통과만을 위한 문제 풀이
그 분은 물론 프로그래밍 전공에, 15년 넘게 프로그래밍을 업으로 해오셨기에 알고리즘에 빠삭하셨다. 그 분은 코드 성능과 시간복잡도, 공간복잡도를 고려하며 코드를 짜시는 분이었다. 그 분 외에도 다른 분들의 최적화된 풀이를 보면서 그동안 나는 통과를 위한 문제 풀이만을 했지, 더 효율적인 풀이를 위해 고민을 덜 했던 것 같아서 반성했다.
동시에 알고리즘 기초를 차근차근 잘 설명해주는 이 책이 더욱 고마웠다. 덕분에 더 열심히 읽게 되었다.
신입 개발자로서 느끼는 점
이 책의 서문에서 공감되는 말이 있었다.
컴퓨터학에 등장하는 많은 개념은 먼저 추상적으로 이해한 뒤 구체적으로 꼼꼼하게 파악하는 것이 좋습니다. 예를 들어 어떤 문제를 해결하는 200줄짜리 코드가 있다고 해 보겠습니다. 한줄 한줄 읽으면서 이해하기에 앞서, 이 코드가 어떤 문제를 어떤 원리로 해결하는지 이해하고, 그다음에 코드를 보면 더 효율적입니다.
알고리즘도 구체적인 부분을 살펴보기에 앞서 추상적으로 그 원리를 이해하는 것이 좋습니다. 특히 알고리즘이 관리하는 상태의 변화를 그림과 숫자로 추적하면서 이해하는 것이 상당히 도움이 됩니다.
원리를 함께 이해하자
이 책을 읽은 후 한 줄 평이다. 물론 원리를 하나하나 다 파악하면서 개발하기보다, 일단 만들어보면서 원리를 파악하는 것도 좋다. 하지만 어떠한 개념을 깊이 있게 알려면 원리를 우선 이해하고 활용하면서 결국 자신만의 것으로 만들어가는 것이 좋을 것 같다.
추천하는 책
출판사로부터 책을 제공받아 주관적으로 작성한 글이지만,
제공받지 않았어도 내돈내산 했을만큼 쉽고 유용한 책입니다.