본문 바로가기

반응형

백엔드/알고리즘, 자료구조

(25)
다이나믹 프로그래밍 ** 정의 모든 경우의 수를 다 세지 않고, 각 구간마다 얼마나 걸리는지를 이용하는 것 여러개의 하위 문제를 풀고, 그 결과를 기록, 이용해 문제를 해결하는 알고리즘 재귀와 비슷하나, 다른 점은 그 결과를 기록하고 이용한다는 것 결과를 기록하는 것을 Memoization이라고 한다. 문제를 쪼갤 수 있는 구조를 겹치는 부분 문제 (Overlapping Subprolem)이라고 한다. 즉, 겹치는 부분 문제일 경우, 동적 계획법을 사용, 이때 메모이제이션을 활용!이라고 생각하면 된다. **예시 대표적인 예로 피보나치가 있다. 1. 그냥 재귀 활용 def fibo(n): if n in [1, 2]: return 1 return fibo(n-1) + fibo(n-2) assert fibo(10) == 55 a..
플로이드 워셜 ** 정의 모든 지점에서 다른 모든 지점까지 최단거리 핵심 개념은, 한 지점에서 다른 지점까지 이르려면, 바로 가거나, 어딘가를 경유하거나이다. 따라서 위의 가설은 전제로 한다. **구현 4 7 1 2 4 1 4 6 2 1 3 2 3 7 3 1 5 3 4 4 4 3 2 테스트 케이스 import sys from collections import defaultdict from pprint import pprint from min_cost.floyd_warshall import floyd_warshall with open('testcase_fw.txt') as f: sys.stdin = f input = sys.stdin.readline N = int(input()) M = int(input()) graph..
최단경로 - 다익스트라 알고리즘 ** 정의 출발 지점이 고정되어있을 때, 인접 노드들을 방문하며 최단 경로 들을 계산해나가는 방법 ** 예시 1. 출발지를 s로 정하고, 다음과 같이 표시한다. (s, t, x, y, z 순) 거리 = [0, inf, inf, inf, inf] 방문 = [True, False, False, False, False] 2. 갈 수 있는 노드들의 최소거리를 측정한다. s->t: 10 s->y: 5 (s, t, x, y, z 순) 거리 = [0, 10, inf, 5, inf] 방문 = [True, False, False, False, False] 3. 방문 안한 녀석들 중 가장 가까운 녀석인 y를 방문하고, 최소거리를 측정한다. y->t: 3 y->x: 9 y->z: 2 (s, t, x, y, z 순) 거리 =..
선택 정렬 **정의 오름차순 정렬 예시 전체를 둘러보고, 가장 크기가 작은 것을 맨 앞과 위치를 바꾼다, 다시 전체를 둘러보고, 다시 제일 작은 것을 2번째에 위치시킨다. 위의 과정을 반복한다. ** 예시 [4, 6, 2, 9, 1] # 정렬되지 않은 배열 1단계 : [4, 6, 2, 9, 1] 4와 6과 2와 9와 1을 차례차례 비교합니다. 그 중 가장 작은 1과 맨 앞 자리인 4를 교체합니다! [**1**, 6, 2, 9, **4**] 이렇게요! 자, 그러면 이제 가장 작은 숫자인 1이 맨 앞으로 왔습니다. 가장 작은 걸 가장 맨 앞으로 옮기기로 했으니까요! 그러면, 맨 앞자리를 제외하고 다시 한 번 반복하면 됩니다. 2단계 : [1, 6, 2, 9, 4] 6과 2와 9와 4를 차례차례 비교합니다. 그 중 가장..
버블 정렬 ** 정의 1번째와 2번쨰, 2번쨰와 3번째......... 마지막 -1 번쨰와 마지막번째를 비교하는 정렬 방식입니다. ** 예시 [4, 6, 2, 9, 1] # 정렬되지 않은 배열 1단계 : [**4, 6**, 2, 9, 1] 4와 6을 비교합니다! 4 2 이므로 둘을 변경합니다! [4, **2, 6**, 9, 1] 이렇게요! 3단계 : [4, 2, 6, 9, 1] 6과 9를 비교합니다! 6 1 이므로 둘을 변경합니다! [4, 2, 6, **1, 9]** 이렇게요! 자, 그러면 이제 한 바퀴를 돌렸죠?..
이진 탐색 ** 정의 배열이 정렬되있다고 가정할 때, **효율성 import math math.log2(100000000) # 26.575424759098897 1억번은 연산해야 할 때, 이진 탐색을 사용하면 26번만 탐색하면 된다. **관련 문제 https://leetcode.com/problems/search-in-rotated-sorted-array/ Search in Rotated Sorted Array - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com https:..
힙 소트 **힙의 정의 힙은 데이터에서 최대값과 최소값을 빠르게 찾기 위해 고안된 이진트리 Max 힙의 경우, 항상 큰 값이 상위 레벨에, 작은 값이 하위 레벨에 있는 구조 부모 노드의 값이 자식 노드의 값보다 크다는 뜻 ** 예시 8 Level 0 6 3 Level 1 2 1 Level 2 # -> 이진 트리 O 완전 이진 트리 X 이므로 힙이 아닙니다! 8 Level 0 6 3 Level 1 # -> 이진 트리 O 완전 이진 트리 O 인데 모든 부모 노드의 값이 4 2 1 Level 2 # 자식 노드보다 크니까 **힙이 맞습니다!** 8 Level 0 6 **3** Level 1 # -> 이진 트리 O 완전 이진 트리 O 인데 모든 부모 노드의 값이 4 2 **5** Level 2 # 자식 노드보다 크지 않아..
합병 정렬 ** 개요 ** 설명 크게 작은 단위로 나누어서, 위로 올라오며 합치는 방식이라고 생각하시면 됩니다. 예시 ) [1, 2, 3, 5] # 정렬된 배열 A [4, 6, 7, 8] # 정렬된 배열 B [] # 두 집합을 합칠 빈 배열 C ↓ 1단계 : [**1**, 2, 3, 5] ↓ [**4**, 6, 7, 8] 1과 4를 비교합니다! 1 < 4 이므로 1을 C 에 넣습니다. C:[1] ↓ 2단계 : [1, **2**, 3, 5] ↓ [**4**, 6, 7, 8] 2와 4를 비교합니다! 2 < 4 이므로 2를 C 에 넣습니다. C:[1, 2] ↓ 3단계 : [1, 2, **3**, 5] ↓ [**4**, 6, 7, 8] 3과 4를 비교합니다! 3 < 4 이므로 3을 C 에 넣습니다. C:[1, 2, 3] ..

반응형