- 문제를 확실히 이해한다.
- 간단한 예를 통해 문제를 확실히 이해하고 있는지 파악한다
- 어떤 알고리즘/자료구조를 사용할지 초점을 맞춘다
- 위 과정에 시간이 오래 소모되어 코딩을 하고 싶은 유혹이 들어도 참는다.
- 예를 다시 따져본다.
- 위에서 시도했던 특정 예를 일반적인 경우로 확장시켜보자.
- 다른 자료구조를 시도해본다.
- 연결 리스트, 배열, 해시 테이블 등 다양한 자료구조를 사용해보자.
- 올바른 자료구조를 사용하는 것만으로 문제 풀이가 수월해지는 일도 흔하다.
- 문제의 본질을 뽑아내어, 본질은 같되 다른말로 풀어 생각해보자.
- 언어에서 그리 많이 쓰이지 않는 기능 또는 고급 기능을 고려해보자.
- 어레이/구조체
- 스택/큐
- 연결리스트
- 트리
- 그래프
- 정렬(자료구조는 아니지만)
- 해시
- 우선순위 큐
- 깊이 우선 탐색.
- 재귀나 스택을 이용한다.
- 너비 우선 탐색.
- 큐를 이용한다.
- 결정 문제(Decision Problem)에서 사용되는 탐색 알고리즘.
- 여러 선택지가 있는 상황에서 한 방향을 선택하다가, 해당 선택이 최적의 해답이 아니라고 판단되면 이전 상태로 돌아와 다른 경로를 탐색한다.
- 문제를 작은 문제로 나누어 해결하는 방식.
- 재귀를 자주 사용한다.
- 부분 문제의 해를 저장해서 큰 문제의 해를 빠르게 구하는 방식.
- 예: 피보나치 수열, LCS.
- 매 순간 최적의 선택을 하는 방식.
- 예: 화폐 문제, 스케줄링 문제.
- 트리의 여러 종류와 그에 따른 연산.
- 정점(Vertex)과 간선(Edge)으로 이루어진 자료구조.
- 연결 여부, 최단 경로 등을 판단할 때 사용.
- 퀵소트, 병합정렬, 버블정렬, 삽입정렬 등.
- LIFO, FIFO 등의 특성에 따른 자료구조.
- 키와 값의 쌍으로 데이터를 저장하거나 중복 없이 데이터를 저장하는 구조.
- KMP, Z-Algorithm, Manacher's Algorithm 등.
- 다익스트라, 플로이드-와샬, 벨만-포드 등.
- 크루스칼, 프림의 알고리즘.
- AND, OR, XOR 등의 비트 연산자를 이용한 문제 풀이.