본문 바로가기

Study/Algorithm10

[Algorithm] LIS(Longest Increasing Subsequence; 최장 증가 부분 수열) LIS(Longest Increasing Subsequence; 최장 증가 부분 수열) 어떠한 수열에서 오름차순으로 정렬된 가장 긴 부분 수열을 찾는 문제 이때, 부분 수열은 서로 연속할 필요는 없다. 어떠한 수열에서 일부 원소를 선택해 새로 만든 수열은 '부분 수열'이며 그 수열이 오름차순으로 정렬되어 있으면 '증가하는 부분 수열'이다. ex) 수열 [10, 20, 10, 30, 20, 50] 해당 수열에서 [10, 20, 30, 50], [10, 20, 50], [10, 50],... 등 많은 증가 부분 수열이 있지만 많은 증가 부분 수열 中 가장 길이가 긴 수열은 4개의 원소를 가진 [10, 20, 30, 50]이다. 따라서 [10, 20, 30, 50] 최장 증가 부분 수열이다. LIS는 DP(D.. 2022. 3. 14.
[Algorithm] Brute Force (브루트 포스) Brute force (브루트 포스) Brute (짐승[야수], 큰 동물) + Force (폭력, 힘) 직관적으로 무식하게 힘을 쓰는 알고리즘 Brute force (브루트 포스) 완전 탐색 알고리즘으로 가능한 모든 경우의 수를 탐색하고 조건에 충족되는 결과를 가져온다. 처음부터 끝까지 무식하게 모두 탐색하여 결과를 찾기 때문에 100%의 확률로 정답을 출력한다. 브루트 포스 알고리즘을 설계할 때는 '해가 하나 이상 존재한다'는 가정을 세우고 모든 범위를 탐색한다. 브루트 포스 장단점 장점 설계하고 구현하기가 쉽다. 100%의 확률로 정답을 구할 수 있다. 단점 알고리즘 실행 시간이 매우 오래 걸린다. 메모리 효율이 매우 떨어진다. 구조에 따른 브루트 포스의 2종류 선형 구조 - 순차 탐색 비선형 구조 .. 2022. 3. 9.
[Algorithm] Dynamic Programming(동적 계획법, 다이나믹 프로그래밍) Dynamic Programming(동적 계획법, 다이나믹 프로그래밍) 응용 수학자 리차드 벨만(Richard Bellman)이 1953년에 고안한 알고리즘 큰 문제를 간단한 여러 개의(작은) 문제(Overlapping Subproblem)로 나누어 해결한 결과를 저장해뒀다가 나중에 큰 문제의 결과와 합하여 풀이하는 알고리즘 즉, 이미 해결한 (작은) 문제의 결과는 저장해 두었다가 다시 계산하지 않도록 하는 알고리즘 부분 하위 문제(Overlapping Subproblem; 중복 부분 문제) 동일한 작은 문제를 반복적으로 해결 최적 부분 구조(Optimal Substructure) 큰 문제를 작은 문제로 나눌 수 있으며, 작은 문제의 답을 모아서 큰 문제를 해결 Algorithm 특징 대표적인 문제 다이.. 2021. 12. 19.
[Algorithm] 이진 탐색(Binary Search, 이분 탐색, 이진 검색) 이진 탐색(Binary Search) 정렬된 데이터 집합을 이분화하면서 특정한 값을 탐색하는 검색 알고리즘 -> 자료들이 순서대로 정리되어 있을 때 원하는 값을 찾기 위해 자료를 반씩 나누어 살펴보는 방법 시간 복잡도가 O(logN)으로 대표적인 로그 시간 알고리즘 1) 특정한 값을 찾기 위해 정렬된 데이터 집합의 중간 값 X와 비교한다. 2) X보다 작으면 X를 기준으로 왼쪽 데이터들, X보다 크면 X를 기준으로 오른쪽 데이터들 대상으로 다시 탐색한다. 3) 1 - 2번을 반복하며 특정값을 찾을 때 까지 반복한다. 종료 조건 : 원하는 값을 찾으면 종료 하지만 원하는 값이 배열에 존재하지 않는다면 탐색을 하다가 찾지 못했는데 더 이상 남은 배열이 존재하지 않으면 원하는 값이 배열에 존재하지 않는다고 판.. 2021. 10. 11.
[Algorithm] LCS (최장 공통 부분 수열, 최장 공통 부분 문자열) LCS의 2가지 Longest Common Subsequence (최장 공통 부분 수열) Longest Common Substring (최장 공통 부분 문자열) Subsequence와 Substring의 차이점 Subsequence : 전체 문자열에서 꼭 연속적이지는 않은 부분 문자열 Substring : 전체 문자열에서 연속된 부분 문자열 str1 : 'ABECJ' str2 : 'ABKJG' 공통 부분 수열 -> {}, {A}, {B}, {J}, {A, B}, {A, J}, {B, J}, {A,B,J} -> 최장 공통 부분 수열 str1 : 'ABECJ' str2 : 'TABJG' 공통 부분 수열 -> {}, {A}, {B}, {A, B} -> 최장 공통 부분 문자열 Longest Common Subs.. 2021. 10. 3.
[Algorithm] 점근 표기법, 빅오 표기법(big-O notation) 점근 표기법 어떤 함수의 증가 양상을 다른 함수와의 비교로 표현하는 방법 이것을 시간 복잡도, 공간 복잡도를 표현할 수 있다. 시간 복잡도 : 알고리즘을 수행하는 데 걸리는 시간 효율성 공간 복잡도 : 알고리즘을 수행하는 데 걸리는 메모리 효율성 대표적 세 가지 유형의 점근 표기법 1. 빅 오(big-O) - 점근적 상한선(upper bound) 기준 2. 빅 오메가(big-Ω) - 점근적 하한선(lower bound) 기준 3. 빅 세타(big-θ) - 점근적 평균 기준 예를 들어 복잡한 함수 f(n)이 있을 때, 실행시간이 가장 빠른게 하한, 실행시간이 가장 느린게 상한이라고 보면 된다. 빅 오(big-O) -> f(n) = O(g(n)) f(n)의 복잡도는 최악의 경우라도 g(n)보다 작거나 같다는.. 2021. 8. 30.
[Algorithm] 그리디 (탐욕) 알고리즘 그리디 알고리즘(탐욕법, Greedy Algorithm) 매 선택에서 현재 상황에 지금 당장 좋은 것만을 선택하여 적합한 결과를 도출하는 알고리즘 설계 기법 이 방법은 선택하는 그 순간에는 최적인 방법이지만 최종적으로 보면 그 선택들이 최적이라는 보장은 없다. 그리디 알고리즘은 완전한 최적해를 보장하지는 않지만 그런대로 괜찮은 해답을 알려준다. 계산속도가 정확한 알고리즘에 비해서 빠른 경우가 많다. 따라서, 적당히 괜찮은 해답을 정해진 시간 내 찾을 때 적합한 알고리즘이다. 대표적인 그리디 알고리즘의 예 : 다익스트라 알고리즘(최단 경로 문제) 대표적인 그리디 알고리즘 문제 : 거스름 동전 개수 구하기 def greedy(money): m = [500, 100, 50, 10] cnt = 0 for i i.. 2021. 8. 13.
[Algorithm] BFS, DFS 그래프 탐색 알고리즘의 두가지 BFS, DFS이다. 그래프 : 정점(node)과 정점들을 이어주는 간선(edge)으로 이루어진 자료구조 Breath First Search (BFS; 너비 우선 탐색) 그래프에서 인접한 노드부터 우선적으로 탐색하는 알고리즘 시작 정점으로부터 인접한 정점을 먼저 방문하고 멀리 떨어져있는 정점을 나중에 방문하는 방법 - 주로 Queue를 이용하여 구현 from collections import deque check = [False]*(v+1)# 각 노드 방문 정보 리스트 def bfs(x, check): # x: 현재 노드 queue = deque([x]) check[x] = True# x 노드 방문 표시 while queue:# queue가 빌 때까지 k = queue.po.. 2021. 8. 1.
[Algorithm/Python(파이썬)] 유클리드 호제법(Euclidean algorithm) 유클리드 호제법(Euclidean algorithm) 2개의 자연수의 최대공약수를 구하는 알고리즘 비교대상의 두 개의 자연수 n, m (단 n >m)에서 n을 m으로 나눈 나머지를 r이라고 했을때 GCD(n, m) = GCD(m, r)과 같고 r이 0이면 그때 m이 최대공약수이다. 라는 원리를 활용한 알고리즘 GCD (Greatest Common Divisior) - 최대공약수 두 수 혹은 그 이상의 여러 수의 공통인 약수 중 최대 인 수 12의 약수 : 1, 2, 3, 4, 6, 12 8의 약수 : 1, 2, 4, 8 8과 12의 최대 공약수 : 4 # 유클리드 호제법을 이용한 최대 공약수를 구하는 파이썬 코드 def gcd(n, m): while (n > 0): m,n = n, m % n return.. 2021. 7. 1.
[Algorithm/Python(파이썬)] 에라토스테네스의 체 에라토스테네스의 체는 수학에서 소수를 찾는 방법이다. 고대 그리스 수학자 에라토스테네스가 발견했다. 소수란? 약수가 1과 자기 자신만을 가지는 정수 2부터 구하고자 하는 구간의 모든 숫자를 나열한다. 2는 소수이므로 오른쪽에 2를 쓴다. 2를 제외한 모든 2의 배수를 지운다. 남아 있는 수 중에 가장 작은 수를 오른쪽에 쓴다. 그 수를 제외한 모두 그 수의 배수를 지운다. 4, 5번를 반복하면 그 구간의 모든 소수가 오른쪽에 적혀있다. 처음에 에라토스테네스의 체를 알기전 아래의 코드로 소수 찾기를 구현했는데 숫자 하나 하나 for문으로 확인하니 코드의 효율성이 떨어져 시간이 초과되었다. # 효율성 없는 소수 찾기 코드 def solution(n): num = 1 for i in range(3, n+1):.. 2021. 6. 18.