알고리즘
- 자료구조
- 기본 알고리즘
- 심화 알고리즘
- 문제풀이
이렇게 카테고리를 나눴다.
알고리즘과 자료구조의 차이
이 둘이 혼용되는 경우가 많은데
서로 다른 개념이다.
git과 github의 차이 정도로 생각하면 되는데, 자료구조는 알고리즘을 구현하기 위한 도구라고 생각하면 된다.
하나의 알고리즘은, 여러개의 자료구조를 사용할 수 있다.
하나의 자료구조는, 여러개의 알고리즘에 사용될 수 있다.
엄밀히 말하면 자료구조끼리도, 알고리즘끼리도 참조할 수 있다
예를들어 배열이라는 자료구조는 트리나 그래프 자료구조를 표현할 때 쓰이기 때문이다.
하지만 알고리즘과 자료구조의 차이를 설명하기 위해 그림에는 넣지 않았다.
기본과 심화는 온전히 저의 주관만 들어간 기준입니다.
알고리즘을 공부하는 사람들의 목적은 크게 3가지로 나눌 수 있다.
- 취업 목적(코딩테스트)
- 프로그래밍 대회 준비
- 지적 유희?
나도 그렇고 아마 대부분의 사람들이 코딩테스트 목적으로 공부할 것이다.
이 블로그에서 소개하려는 기본 알고리즘이란 코딩테스트에 나오는 알고리즘을 전부 포함하고 있다.
물론 내가 코딩테스트에 통달할 정도의 압도적인 실력은 아니지만
지금까지 내가 풀어본 웬만한 기출문제나 백준 골드문제는 무조건 기본 알고리즘만으로 풀 수 있었다.
세세한 구현 여부에 정답이 갈릴 수는 있지만 사용하는 알고리즘 자체는 기본 알고리즘 선에서 끝났다.
기본 알고리즘만으로 모든 코딩테스트 문제를 풀 수 있다고 생각해서 따로 카테고리를 나눴다.
그럼 심화 알고리즘은?
기본 알고리즘보다는 어렵고 난해한 알고리즘이다.
프로그래밍 대회 준비를 하기 위해서는 필수이다.
나는 대회 준비를 하지 않을뿐더러 할 실력도 아니기 때문에 너무 Deep한 영역까지는 들어가지 않으려 한다.
하지만 심화 알고리즘도 기본의 연장선인 경우도 꽤 있어서
알아두면 코딩테스트때 남들보다 유연하게 문제를 풀 수 있으며
테스트 통과후 면접때 코드리뷰를 진행하면서 자신의 코딩 실력을 어필할 수 있을 것이라고 생각한다.
자료구조
- 배열(Array)
- 리스트(List)
- 큐(Queue)
- 스택(Stack)
- 덱(Dequeue)
- 우선순위 큐(Priority-Queue)
- 트리(Tree)
- 그래프(Graph)
- 해시(Hash)
기본 알고리즘
- 브루트 포스(Brute-Force)
- 백트래킹(Back-Tracking)
- 다이나믹 프로그래밍(DP)
- 이분탐색(Parametric-Search)
- 깊이우선탐색(Depth-First-Search)
- 너비우선탐색(Breadth-First-Search)
- 다익스트라(Dijkstra)
- 플로이드-워셜(Floyd-Warshall)
- 그리디(Greedy)
- 비트마스킹(Bitmask)
- 유니온파인드(Union-Find)
- 최소 스패닝트리(Minimun-Spanning-Tree)
- 투포인터(Two-Pointer)
- 스위핑(Sweeping)
- 누적합(Prefix-Sum)
- 분할정복(Divide-Conquer)
- 위상정렬(Topological-Sort)
심화 알고리즘
- 세그먼트 트리(Segment-Tree)
- 강한 연결 요소(Strongly-Connected-Component)
- 트라이(Trie)
- KMP
- 최대 유량(Maximum-Flow)
- 오일러 경로(Euler-Circuit)
- 벨만 포드(Bellman-Ford)
- 이분 매칭(Bipartite-Matching)