728x90

algorithm 11

[알고리즘] 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

[알고리즘] 서로소 집합 (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

[알고리즘] 깊이 우선 탐색 / 너비 우선 탐색 (DFS / BFS Algorithm)

스택은 선입후출 구조 또는 후입선출 구조라고 함 큐는 선입선출 구조라고 함 재귀 함수란 자기 자신을 호출하는 함수이다 DFS는 그래프에서 깊은 부분을 우선적으로 탐색하는 알고리즘이다 BFS는 가까운 노드부터 탐색하는 알고리즘이다 DFS - 스택의 동작 원리, 재귀 함수 이용하여 구현 BFS - 큐의 동작 원리, 큐 자료구조 이용하여 구현 자료구조 기초 탐색이란 많은 양의 데이터 중에서 원하는 데이터를 찾는 과정을 의미한다. 프로그래밍에서는 그래프, 트리 등의 자료구조 안에서 탐색을 하는 문제를 자주 다룬다. 대표적인 탐색 알고리즘으로 DFS와 BFS를 꼽을 수 있다. DFS와 BFS를 제대로 이해하려면 기본 자료구조인 스택과 큐에 대한 이해가 전제되어야 한다. 자료구조란 '데이터를 표현하고 관리하고 처리..

개발/알고리즘 2021.10.19

[알고리즘] 구현 알고리즘 (Implementation Algorithm)

구현 문제 유형은 모든 범위의 코딩 테스트 문제 유형을 포함하는 개념 프로그래밍 언어의 문법을 정확히 알고 있어야 함 라이브러리 사용 경험을 늘려야 함 파이썬의 경우 자료형의 표현 범위 제한에 대해 깊게 생각하지 않아도 되지만 실수형 변수는 유효숫자에 따라서 연산 결과가 원하는 값이 나오지 않을 수 있음 크기가 1,000만 이상인 리스트가 있다면 메모리 용량 제한으로 문제를 풀 수 없게 되는 경우도 있음 일반적인 기업 코딩 테스트 환경에서는 파이썬으로 제출한 코드가 1초에 2,000만 번의 연산을 수행한다고 가정하면 크게 무리가 없음 알고리즘 문제를 풀 때는 시간제한과 데이터의 개수를 먼저 확인한 뒤에 이 문제를 어느 정도의 시간 복잡도의 알고리즘으로 작성해야 풀 수 있을 것인지 예측할 수 있어야 함 코..

개발/알고리즘 2021.10.18
728x90