Brute Force

  • 모든 경우의 수를 확인하여 답을 찾는 방법

Back Tracking

  • 모든 경우의 수를 탐색하는 과정에서 해가 될 가능성이 없으면 탐색을 중지 시킨 뒤 그 이전으로 돌아가서 다른 경우를 탐색

Greedy

  • 결정의 순간마다 최적이라고 생각되는것을 선택해 답을 찾는 방법
  • 이전의 선택이 이후의 선택에 영향을 주지 않아야 함

Divide And Conquer

  • 문제를 나눌 수 없을 때 까지 나누고, 각각을 풀면서 다시 합병하여 문제의 답을 찾는 방법
  • 문제를 둘 이상의 부분 문제로 나누는 자연스러운 방법이 존재해야 함
  • 부분문제의 답을 이용하여 원래의 답을 계산하는 효율적인 방법이 존재해야 함

Binary Search

  • 정렬되어 있는 리스트에서 탐색 범위를 절반씩 좁혀가며 데이터를 탐색
  • 숫자가 크면 int 대신 long을 사용하자

Shortest Path

Dijkstra

  • 특정한 하나의 정점에서 다른 모든 정점으로 가는 최단경로를 찾는 방법
  • 간선들의 가중치는 모두 양수 이어야 함

Bellman Ford

  • 특정한 하나의 정점에서 다른 모든 정점으로 가는 최단경로를 찾는 방법
  • 간선의 가중치가 음수일때도 사용 가능
  • 최단거리 변수가 굉장히 작아질수도 있으니 long을 사용하자
  • 방문 가능한지 확인하려면,
    • visit 배열을 만들고 도착지점 부터 체크 하기
  • 음의 순환구조가 있는지만 확인하려면,
    • 출발점과 확인하려는 간선의 출발지점까지 경로가 없어도 탐색해야 함

Floyd Warshall

  • 모든 정점에서 모든 정점으로의 최단경로를 찾는 방법
  • 간선의 가중치가 음수일때도 사용 가능
  • 최단거리 변수가 굉장히 작아질수도 있으니 long을 사용하자
  • 경로의 길이가 원래의 것보다 작은것이 들어오면 교체 해줘야 함

Two Pointers

  • 1차원 배열에 대해 2개의 포인터를 조작하면서 답을 찾는 방법

Union Find

  • 여러개의 노드들 중 각각 선택한 두개의 노드가 서로 연결되어 있는지 판별하는 방법
  • 부모 노드를 자기 자신으로 초기화 해줘야 함

Minimum Spanning Tree

  • 가장 적은 비용으로 모든 노드를 연결하는 방법

Topological Sorting

  • 순서가 정해져있는 작업을 차례로 수행해야 할 때 그 순서를 결정하는 방법
  • 방향이 있고, 사이클이 발생하지 않는 그래프 일때만 적용 가능

Prefix Sum

  • 나열된 수의 누적된 합을 구하는 방법

Sieve Of Eratosthenes

  • 대량의 소수들을 구하는 방법

Dynamic Programming

  • 큰 문제를 작은 문제로 나누어서 푸는 방법
  • 계속해서 같은 부분 문제가 여러번 재사용되어 해결되는 문제 이어야함
  • 문제의 해를 작은 문제의 해에서 구할수 있어야함

Math

Euclidean

  • 2개의 자연수의 최대공약수를 구하는 방법

Notation Conversion

  • 다른 진법으로 변환하는 방법