728x90

개발/알고리즘 13

[알고리즘] KMP 알고리즘 (Knuth–Morris–Pratt Algorithm)

KMP 알고리즘 KMP 알고리즘은 문자열 중에 특정한 패턴을 찾아내는 문자열 검색 알고리즘이다. 보통 문자열을 검색하기 위해 자바에서는 아래와 같이 indexOf를 이용해서 쉽게 문자열 포함 여부 및 포함 위치를 알아낼 수 있다. String str1 = "abcdefgh"; String str2 = "cdef"; System.out.println(str1.indexOf(str2)); // 2 하지만 이 방법은 모든 경우를 비교해서 찾아내는 방법으로 최악의 시간 복잡도를 가진다. 그래서 짧은 문자열이나 반복 작업이 아니라면 indexOf를 사용하는 것이 괜찮을지라도 긴 문자열이나 문자열 검색을 자주 실행해야 한다면 더 효율적인 문자열 검색 알고리즘이 필요할 것이다. 본인도 백준 문제(16916 - 부분 ..

개발/알고리즘 2022.07.02

[알고리즘] 최장 증가 수열 - LIS (Longest Increasing Subsequence)

최장 증가수열(Longest Increasing Subsequence) 문제는 왼쪽에서 오른쪽으로 나열된 수열이 있으면, 그 배열 순서를 유지하면서 크기가 점진적으로 커지면서 가장 긴 부분 수열을 추출하는 문제이다. 이때 문제마다 점진적으로 커지는 기준이 같은 수도 포함시킬 수 있으니 문제를 잘 읽고 풀어야 한다. 풀이 방법 기본적으로 최장 증가수열 문제를 풀 수 있는 방법은 크게 Brute-force 방식과 DP 방식 두 가지로 나눌 수 있다. 하지만 Brute-force 방식은 부분집합 알고리즘을 이용하여 지수 시간 복잡도를 가지기 때문에 추천할만한 방법은 아니다. 그러면 DP 방식을 통해 최장 증가수열 문제를 푸는 방법에 대해서 알아보자. Dynamic Programming n개의 숫자열 : a₁,..

개발/알고리즘 2022.04.07

[알고리즘] 배낭 문제 (0-1 Knapsack Problem)

배낭 문제(0-1 Knapscak Problem)는 N개의 물건과 배낭의 용량이 주어질 때 배낭에 담을 수 있는 물건의 최대 가치를 찾는 문제이다. 각 물건은 1개씩만 있고 물건마다 무게와 가치가 주어진다. 문제 조건 W = 배낭의 용량 vᵢ = i번째 물건의 가치 wᵢ = i번째 물건의 무게 K[i, w] = 1번 물건부터 i번째 물건까지만 고려하고, 배낭 용량이 w일 때의 최대 가치 (i = 1 ~ n, w = 1 ~ W) 이때 K[i, w]를 재귀적으로 표현하면 1. ( i = 0 or w = 0 ) 🡢 0 i가 0이거나 w가 0이면 0이다. 2. ( wᵢ > w ) 🡢 K[i - 1, w] i번째 물건의 무게 wᵢ가 남은 배낭 용량보다 크면 i번째 물건을 포함하지 못한다. 3. ( i > 0 an..

개발/알고리즘 2022.03.31

[알고리즘] 위상 정렬 (Topology Sort)

위상 정렬 알고리즘은 방향 그래프의 모든 노드들을 방향성에 거스르지 않도록 순서대로 나열하는 정렬 기법을 의미한다. 위상 정렬 위상 정렬은 정렬 알고리즘의 일종이다. 위상 정렬은 순서가 정해져 있는 일련의 작업을 차례대로 수행해야 할 때 사용할 수 있는 알고리즘이다. 조금 더 이론적으로 설명하자면, 위상 정렬이란 방향 그래프의 모든 노드를 '방향성에 거스르지 않도록 순서대로 나열하는 것'이다. 위상 정렬 알고리즘을 자세히 살펴보기 전에, 먼저 진입차수를 알아야 한다. 진입차수란 특정한 노드로 '들어오는' 간선의 개수를 의미한다. 위상 정렬 알고리즘은 다음과 같다. 1. 진입차수가 0인 노드를 큐에 넣는다. 2. 큐가 빌 때까지 다음의 과정을 반복한다. 1. 큐에서 원소를 꺼내 해당 노드에서 출발하는 간선..

개발/알고리즘 2021.10.28

[알고리즘] 신장 트리 - 크루스칼 알고리즘 (Spanning Tree - Kruskal Algorithm)

신장 트리는 하나의 그래프가 있을 때 모든 노드를 포함하는 부분 그래프를 의미한다. 크루스칼 알고리즘은 가능한 최소 비용의 신장 트리를 찾아주는 알고리즘이다. 간선을 정렬한 뒤에 간선의 비용이 작은 순서대로 차례대로 최소 신장 트리를 만들어 가는 그리디 알고리즘의 일종이다. 신장 트리 신장 트리는 그래프 알고리즘 문제로 자주 출제되는 문제 유형이다. 기본적으로 신장 트리란 하나의 그래프가 있을 때 모든 노드를 포함하면서 사이클이 존재하지 않는 부분 그래프를 의미한다. 크루스칼 알고리즘 우리는 다양한 문제 상황에서 가능한 한 최소한의 비용으로 신장 트리를 찾아야 할 때가 있다. 이처럼 신장 트리 중에서 최소 비용으로 만들 수 있는 신장 트리를 찾는 알고리즘을 '최소 신장 트리 알고리즘'이라고 한다. 대표적..

개발/알고리즘 2021.10.27

[알고리즘] 서로소 집합 (Disjoint Sets Algorithm)

서로소 집합은 공통 원소가 없는 두 집합이다. 서로소 집합 알고리즘은 union-find 연산으로 구성되며, 모든 노드는 자신이 속한 집합을 찾을 때 루트 노드를 재귀적으로 찾는다. 서로소 집합 수학에서 서로소 집합이란 공통 원소가 없는 두 집합을 의미한다. 서로소 집합 자료구조란 서로소 부분 집합들로 나누어진 원소들의 데이터를 처리하기 위한 자료구조라고 할 수 있다. 서로소 집합 자료구조는 union과 find 2개의 연산으로 조작할 수 있다. union(합집합) 연산은 2개의 원소가 포함된 집합을 하나의 집합을 합치는 연산이다. find(찾기) 연산은 특정한 원소가 속한 집합이 어떤 집합인지 알려주는 연산이다. 서로소 집합 자료구조는 union-find(합치기 찾기) 자료구조라고 불기기도 한다. 서로..

개발/알고리즘 2021.10.26

[알고리즘] 다익스트라 / 플로이드 워셜 - 최단 경로 알고리즘 (Dijkstra / Floyd Warshall - Shortest Path Algorithm)

다익스트라 알고리즘은 한 지점에서 다른 모든 지점까지의 최단 경로를 계산하는 알고리즘이다. 플로이드 워셜 알고리즘은 모든 지점에서 다른 모든 지점까지의 최단 경로를 계산하는 알고리즘이다. 다익스트라의 시간 복잡도는 간단하게 구현하면 O(V²)이고 개선된 방법은 O(ElogV)이다. 플로이드 워셜의 시간 복잡도는 O(V³)이다. 최단 경로 알고리즘은 말 그대로 가장 짧은 경로를 찾는 알고리즘이다. 그래서 '길 찾기' 문제라고도 불린다. 최단 경로 알고리즘 유형에는 다양한 종류가 있는데, 상황에 맞는 효율적인 알고리즘이 이미 정립되어 있다. 최단 경로 문제는 보통 그래프를 이용해 표현하는데 각 지점은 그래프에서 '노드'로 표현되고, 지점 간 연결된 도로는 그래프에서 '간선'으로 표현된다. 컴퓨터공학과 학부 ..

개발/알고리즘 2021.10.23

[알고리즘] 다이나믹 프로그래밍 (동적 계획법) (Dynamic Programming)

연산 속도와 메모리 공간을 최대한으로 활용할 수 있는 효율적인 알고리즘을 작성해야 한다. 메모이제이션은 다이나믹 프로그래밍을 구현하는 방법 중 한 종류로, 한 번 구한 결과를 메모리 공간에 메모해두고 같은 식을 다시 호출하면 메모한 결과를 그대로 가져오는 기법을 의미한다. 다이나믹 프로그래밍이란 큰 문제를 작게 나누고, 같은 문제라면 한 번씩만 풀어 문제를 효율적으로 해결하는 알고리즘 기법이다. 가능하다면 재귀 함수를 이용하는 탑다운 방식보다는 보텀업 방식으로 구현하는 것을 권장한다. 다이나믹 프로그래밍 컴퓨터의 연산 속도에 한계가 있고, 메모리 공간을 사용할 수 있는 데이터의 개수도 한정적이라는 점이 많은 제약을 발생시킨다. 그래서 우리는 연산 속도와 메모리 공간을 최대한으로 활용할 수 있는 효율적인 ..

개발/알고리즘 2021.10.22

[알고리즘] 이진 탐색 (Binary Search)

순차 탐색이란 리스트 안에 있는 특정한 데이터를 찾기 위해 앞에서부터 데이터를 하나씩 차례대로 확인하는 방법이다. 이진 탐색은 위치를 나타내는 변수 3개를 사용하는데 탐색하고자 하는 범위의 시작점, 끝점, 그리고 중간점이다. 찾으려는 데이터와 중간점 위치에 있는 데이터를 반복적으로 비교해서 원하는 데이터를 찾는 게 이진 탐색 과정이다. 이진 탐색 문제는 입력 데이터가 많거나, 탐색 범위가 매우 넓은 편이다. 예를 들어 데이터의 개수가 1,000만 개를 넘어가거나 탐색 범위의 크기가 1,000억 이상이라면 이진 탐색 알고리즘을 의심해보자. 입력 데이터가 많은 문제는 sys 라이브러리의 readline() 함수를 이용하면 시간 초과를 피할 수 있다. 순차 탐색 이진 탐색에 대해 알아보기 전에 가장 기본 탐색..

개발/알고리즘 2021.10.21

[알고리즘] 선택, 삽입, 퀵, 계수 정렬 (Selection, Insertion, Quick, Count sort)

정렬이란 데이터를 특정한 기준에 따라서 순서대로 나열하는 것이다. 선택 정렬은 매번 가장 작은 것을 '선택'하여 앞으로 보내면서 정렬하는 알고리즘이다. 선택 정렬의 시간 복잡도는 O(N²)이다. 파이썬 기본 정렬 라이브러리의 수행 시간이 상당히 빠르다. 삽입 정렬은 특정한 데이터를 적절한 위치에 '삽입'하며 정렬하는 알고리즘이다. 삽입 정렬의 시간 복잡도는 O(N²)인데 리스트의 데이터가 거의 정렬되어 있는 상태라면 최선의 경우 O(N)의 시간 복잡도를 가진다. 따라서 거의 정렬되어 있는 상태의 데이터라면 다른 알고리즘보다 삽입 정렬을 이용하는 것이 유리하다. 퀵 정렬은 기준을 설정한 다음 큰 수와 작은 수를 교환한 후 리스트를 반으로 나누는 방식으로 동작한다. 퀵 정렬은 평균적으로 시간 복잡도가 O(l..

개발/알고리즘 2021.10.20
728x90