알고리즘 공부, 어떻게 시작할까
- 목차
- 알고리즘 공부에 대해
- 그렇다면 이 알고리즘 공부의 시작을 어떻게 해야 하나
- 그래서, 공부 순서가 어떻다고?
- 필수 개념 알아보기
- 공부에 사용할 자료 및 사이트
알고리즘 공부에 대해
현직 개발자들도 '알고리즘 공부를 해야 하는데...'와 같은 생각을 자주 한다고 한다. 그러나 실무처리 외에 시간을 내어 공부해야 하는 입장이다 보니 자연스레 알고리즘 공부는 후순위로 밀려나게 된다고 한다. 따라서 미리미리 알고리즘의 기초를 잘 다져놓고 꾸준히 공부하여 취업을 하는 것이 장기적인 시각에서 내게 도움이 될 것으로 판단했다.
- 알고리즘을 잘 한다는 것?
알고리즘을 잘 한다는 게 뭐인지가 궁금해졌다. 이것저것 찾아보고 생각을 정리해본 결과 문제를 보고 '풀 수 있다는' 게 알고리즘을 잘 하는 것이 아니었다. 문제를 제대로 파악하고, 효율적인 방법을 떠올려 큰 수를 넣어도 안정적으로 돌아가게끔 하는 일련의 과정을 잘 해내는 것이 알고리즘을 잘 하는 것이었다.
알고리즘 공부의 시작을 어떻게 해야 하나?
알고리즘을 공부할 때 그 시작은 무엇으로 해야할지, 자료는 무엇을 참고해야 하는지에 대한 고민이 앞섰다. 이러한 고민에 대해서 여러 블로그를 참조하여 골격을 짜보려고 시도했다. 처음에는 스택, 큐, 그래프 등의 기본적인 자료구조 개념들에 대한 (완벽한)이해를 시작으로 하는 것으로 설정했다. 문제는 그 다음이었다.
내가 알고리즘을 공부하는 1차적인 목적은 일단 알고리즘 대회에서 수상하는 것 같은 게 아니라 코딩테스트 통과를 노려보는 데에 있었다. 그래서 어차피 코딩테스트 통과에 목적을 둔다면 자료구조의 개념 정도만 파악하고 그것을 사용하기 위해 어떻게 import시키는지 정도만 알면 되는 것으로 생각했다. 그러나 여러 글들을 읽어보니 주니어 개발자부터 시작해서 경험 많은 개발자까지 하나같이 자료구조에 대한 공부를 탄탄히 하라는 말을 하고 있었다. 자료구조를 깊이 있게 공부해야 하는 것은 확실히 필요한 사항이었다.
그럼 자료구조 탄탄히 하면되지, 뭘 더 생각하나
자료구조를 제대로 공부하는 게 중요한 것은 알겠다. 그런데 진짜 내게 고민이었던 건 얼만큼 깊게 할 것이냐였다. 그러니까 과연 구체적인 코드 구현까지 바로바로 해낼 수 있는 수준까지 공부를 할 것인지 아닌지에 대해 정해야했다.
이러한 고민을 하게 된 배경에는 전에 자료구조를 잠깐 공부했던 경험이 있었다. 사실 예전에 C언어로 스택, 큐, 이진트리, 정렬 등에 대한 개념을 공부한 적이 있다. 당시 아무것도 안 보고 그 개념에 해당하는 문제들을 잘 구현할 수 있을 정도로 공부했다. 그러나 그 때로부터 5개월이 지난 지금 현재, 개념은 기억이 나지만 그 개념들을 모두 코드로 구현해보라고 하면 하나라도 제대로 할 자신이 없다.
이에 대한 나의 선택
일단 나는 선택을 해야 하기에, 개념 정도만 파악하고 아무것도 보지 않고 구현해보는 것은 개념별로 필요성이 느껴질 때 공부하기로 했다. 이러한 결정을 내리게 된 데에는 한번 공부한 것들을 잊어버린 경험이 컸다.
한 블로그 글에서는 다음과 같은 방법을 권장했다. 주제별로 한 문제씩 풀어보면서 '아, 이런 풀이법으로 풀면 되는구나'에 대한 '감'을 자연스럽게 익히는 것이다. 알고리즘 문제들을 많이 풀어보지는 않았지만 판단하기에 방금 말했던 방법이 내게 가장 적합할 것 같다는 생각이 들었다. 무작정 다 외우지 말고, '감'을 제대로 잡아보도록 해야겠다.
그래서, 공부순서가 어떻다고?
- 기본적인 개념 이해(자료구조 및 시간복잡도, 특히 정렬에 대한 이해)
- 개념을 코드로 구현(따라쳐보고 코드를 이해하는 수준까지만)
- (주로 쉬운) 문제들을 풀어보며 해결법에 익숙해지기.
필수 개념 알아보기
-
자료구조가 큰 틀에서 어떻게 생겼는지.
(출처 : 여기)
시간복잡도에 대한 개념(출처 : 여기)
시간 복잡도 | 설명 |
---|---|
O(1) | 상수 형태. n의 값에 상관없이 일정한 양의 계산만 한다. |
O(logn) | 로그 형태 |
O(n) | 선형 |
O(nlogn) | 선형로그 형태 |
O(n2),O(n3),⋯ | 다차 형태 |
O(2n) | 지수 형태 |
O(n!) | 팩토리얼 형태 |
-
정렬
- 버블정렬(Bubble sort)
- 선택정렬(Selection sort)
- 삽입정렬(Insertion sort)
- 병합정렬(Merge sort)
- 퀵 정렬(Quick sort)
자세한 개념은 여기 에서 확인
공부 순서에 따른 공부 자료 및 사이트
-
1, 2번
- 후보 :
- 종만북(구종만의 알고리즘 문제 해결 전략 세트)
- Do it! 자료구조와 함께 배우는 알고리즘 입문.
- librewiki - 사이트
나는 java언어를 택했고, 이미 인터넷 사이트(wikidocs 점프투자바)로 자바 기초 개념들을 학습했기에 책으로 공부하고 싶었다. 그리고 종만북은 난이도가 꽤 있다고 들어서 알고리즘 입문서인 Do it! 시리즈를 선택했다. 책을 보면서 학습하는 게 익숙한 방법이라는 이유도 조금 있다.
- 후보 :
-
3번 - 쉬운 문제 풀며 해결법에 익숙해지기
백준
프로그래머스
코딩도장
geeksforgeeks
leetcode
codeforces여기서는 친구의 추천으로 과감히 프로그래머스를 선택했다. 주로 한국 기업들이 코딩테스트를 볼 때 이 사이트를 많이 이용한다고 한다.(삼성 제외)
정리
알고리즘 공부를 어떻게 시작할 것인지에 대해 초점을 놓고 글을 시작했다. 다음으로 알고리즘 공부를 어떻게 시작할지에 대해 결정했고, 공부에 필수적인 개념과 자료 및 사이트를 공유했다. 시간이 흘러 후기를 작성하는 내 모습을 그려본다.
refs :
-
알고리즘에 대한 고민
https://m.blog.naver.com/PostView.nhn?blogId=islove8587&logNo=220548856458&proxyReferer=https:%2F%2Fwww.google.com%2F
https://jwlee010523.tistory.com/entry/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B8%B0%EB%B3%B8%EC%A0%81%EC%9D%B8-%EC%9D%B4%ED%95%B4
https://baactree.tistory.com/14
https://baactree.tistory.com/52?utm_source=gaerae.com&utm_campaign=%EA%B0%9C%EB%B0%9C%EC%9E%90%EC%8A%A4%EB%9F%BD%EB%8B%A4&utm_medium=social
https://blog.yena.io/studynote/2018/11/14/Algorithm-Basic.html
https://librewiki.net/wiki/%EC%8B%9C%EB%A6%AC%EC%A6%88:%EC%88%98%ED%95%99%EC%9D%B8%EB%93%AF_%EA%B3%BC%ED%95%99%EC%95%84%EB%8B%8C_%EA%B3%B5%ED%95%99%EA%B0%99%EC%9D%80_%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B3%BC%ED%95%99/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98_%EA%B8%B0%EC%B4%88
'Algorithm' 카테고리의 다른 글
프로그래머스 - 완주하지 못한 선수(Java) (0) | 2020.07.02 |
---|---|
알고리즘 1부터 n까지의 합 - 가우스 (0) | 2020.06.04 |
programmers - 문자열 내림차순으로 배치하기 (0) | 2020.03.14 |
programmers - 두 정수 사이의 합 (0) | 2020.03.12 |
Programmers - 가운데 글자 출력하기 (0) | 2020.03.12 |
최근댓글