본문 바로가기

자료구조 & 알고리즘 & cs/알고리즘

(18)
[TIL] LIS 알고리즘 (최장 증가 부분 수열) 최장 증가 부분 수열(LIS, Longest Increasing Subsequence) - 원소가 n개인 배열의 일부 원소로 만든 수열 중 각 원소가 이전의 원소보다 크며 길이가 최대인 부분 수열 백준 dp 알고리즘을 풀다가 LIS 알고리즘을 접하게 되었다. LIS를 푸는 방법으로는 DP를 이용한 방법과 이분탐색 방법 두 가지가 있다. 1.DP를 활용 [1,3,2,7,6,4,9,8] 이라는 배열 lst가 존재할 때 dp 리스트를 사용하여 각 인덱스별로 최장 증가 부분 수열의 길이를 구한 것이다. lst =[1,3,2,7,6,4,9,8] dp=[1]*len(lst) for i in range(len(lst)): for j in range(i): if lst[i]>lst[j]: dp[i] = max(dp[i..
[TIL] 최단 경로 알고리즘 - 다익스트라 최단 경로란? 두 노드를 잇는 가장 짧은 경로를 찾는 것 가중치 그래프에서 간선의 가중치 합이 최소가 되도록 하는 경로 특정 노드에서 출발하여 또 다른 특정노드에 도착하는 가장 짧은 경로를 찾음 그래프 내의 특정 노드에 대해 다른 모든 노드 각각에 대한 가장 짧은 경로를 찾음 ex) 다익스트라 그래프 내의 모든 쌍에 대한 최단 경로를 찾음 다익스트라 알고리즘 최단 경로 알고리즘 중 하나로 하나의 정점에서 다른 모든 정점 간의 각각 가장 짧은 거리를 구하는 알고리즘 인접한 정점들의 거리를 계산하여 최단 거리로 갱신 BFS와 비슷 다익스트라 알고리즘 이해 우선순위 큐를 사용 (최소힙) -> 가장 낮은 우선순위를 가진 노드를 pop 각 정점까지의 거리를 계산하는 배열과 인접노드와 그 거리를 비교하는 우선순위 ..
[TIL] 탐욕 알고리즘 - Greedy Algorithm 탐욕 알고리즘 최적의 해에 가까운 값을 구함 매 순간 최적이라고 생각되는 경우 근사치 추정에 활용 -> 반드시 최적의 해를 구하는 것은 아님 관련 문제 1541번: 잃어버린 괄호 (acmicpc.net) 1541번: 잃어버린 괄호 첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 www.acmicpc.net 식을 입력받아 괄호를 적절히 사용하여 값을 최소로 만드는 문제이다. 이 문제에서는 최소의 값을 구하는 것이 최적의 해를 구하는 것이므로 그리디 알고리즘을 사용하여 해결한다. 문제를 분석해보았을 때 - 다음 + 연산이 나올 경우 괄호를 사용하면 최소값을 구할..
[TIL] 그래프- BFS, DFS BFS(Breadth First Search) 너비 우선 탐색 알고리즘 정점들과 같은 레벨의 노드들을 먼저 탐색 (형제 노드들) 파이썬에서 딕셔너리와 리스트를 이용하여 표현 그래프 표현 graph = dict() graph['A'] = ['B', 'C'] graph['B'] = ['A', 'D'] graph['C'] = ['A', 'E', 'F'] graph['D'] = ['B', 'G', 'H'] graph['E'] = ['C'] graph['F'] = ['C', 'I'] graph['G'] = ['D'] graph['H'] = ['D'] graph['I'] = ['F'] BFS 구현 큐를 활용 (방문한 노드 저장(visited), 방문할 노드 저장(need-visit) - 파이썬에서 리스트로 구현 d..
[TIL] 그래프- 개념 그래프(Graph) 실제 세계의 현상이나 사물을 정점Vertex(노드)와 간선Edge으로 표현하기 위해 사용 루트 노드, 부모/자식의 개념이 존재하지 않음 용어 정점(Vertex)/노드(Node) : 위치 간선(Edge)/link/branch : 위치 간의 관계를 표시한 선 인접 정점(Adjacent Vertex) : 간선으로 직접 연결된 정점 정점의 차수(Degree) : 무방향 그래프에서 하나의 정점에 인접한 정점의 수 진입 차수(In-Degree) : 방향 그래프에서 외부에서 오는 간선의 수 진출 차수(Out-Degree) : 방향 그래프에서 외부로 향하는 간선의 수 경로 길이(Path Length) : 경로를 구성하기 위해 사용된 간선의 수 단순 경로(Simple Path) : 처음/끝 정점을 제..
[TIL] 탐색 알고리즘- 이진 탐색, 순차 탐색 이진 탐색(Binary Search) 작은 문제 해결 후 이를 이용하여 큰 문제를 해결 - 분할 정복 정렬된 상태의 리스트를 이용 def bs(data, search): if len(data)==1 and search == data[0]: return True if len(data)==1 and search != data[0]: return False if len(data) == 0: return False medium = len(data)//2 if search == data[medium]: return True else: if search > data[medium]: return bs(data[medium+1:], search) else: return bs(data[:medium], search) 이..
[TIL] 동적 계획법 - DP, Dynamic Programming 동적 계획법(DP) 작은 문제 해결 후 이를 이용하여 큰 문제를 해결 상향식 접근법 (보텀업) Memoization 기법(하향식/탑다운) Memoization? = caching - 프로그램 실행 시 이전의 값을 저장하여 중복되는 계산 횟수를 줄여 실행 속도를 빠르게 하는 기술 동적 계획법 문제 풀이 1904번: 01타일 (acmicpc.net) 1904번: 01타일 지원이에게 2진 수열을 가르쳐 주기 위해, 지원이 아버지는 그에게 타일들을 선물해주셨다. 그리고 이 각각의 타일들은 0 또는 1이 쓰여 있는 낱장의 타일들이다. 어느 날 짓궂은 동주가 지원이 www.acmicpc.net 동적계획법 문제이다. 피보나치 수열을 해결하는 방법과 똑같아서 코드를 작성하였는데 메모리 초과가 떴다. import sys..
[TIL] 병합정렬 - Merge Sort 병합 정렬 재귀를 사용 리스트를 반으로 나눈 후 각 리스트를 합병 정렬을 이용하여 정렬 리스트를 나누는 split 함수와 이를 다시 병합하는 merge함수가 필요 split 함수 - 재귀용법을 이용하여 리스트를 반으로 나누는 함수 def split(data): if len(data) l_point and len(right) >r_point: if left[l_point] > right[r_point]: merged.append(right[r_point]) r_point+=1 else: merged.append(left[l_point]) l_point+=1 #left 원소만 있을 때 while len(left)>l_point: merged.append(left[l_point]) l_point+=1 #rig..

728x90