본문 바로가기

알고리즘5

[알고리즘] 벨만 포드 알고리즘 (Bellman-Ford) Bellman-Ford Algorithm 이 알고리즘은 모든 간선을 전부 확인하여, 음수 가중치도 문제도 해결할 수 있습니다. 1. 엣지 리스트를 활용한다. 위에 언급한 것처럼, '모든 간선(엣지)'를 전부 확인함으로 엣지 리스트를 사용하는 편이 직관적이고 효율적입니다. 엣지 리스트란, 단순하게 모든 엣지 정보(시작 노드, 도착 노드, 비용)을 담은 리스트입니다. 2. 'update'를 노드의 개수 - 1번 만큼 반복한다. 우선, 다익스트라에서 사용한 것과 유사하게, 최소 비용 배열을 선언한 후, 모두 무한의 값으로 초기화합니다. (최소비용배열[N] = 시작 노드에서 출발하여 N번 노드로 가는 최소비용) 이 배열의 시작 노드 값을 0으로 설정합니다. 이제 Update는 아래와 같습니다. 엣지 리스트를 순.. 2023. 1. 13.
[알고리즘] BFS와 다익스트라 알고리즘 들어가며 오늘은 그래프에서 최단 경로를 찾는 방법에 대해 정리해보려합니다. 정리 상황에 맞는 알고리즘을 잘 정리해둔 것을 보아서 가져와봤습니다. 단일 node - 단일 node 모든 node쌍 Edge에 weight 없음 Breadth First Search (BFS) Floyd-Warshall Algorithm Edge에 weight 있음 음수 weight 있음 Bellman-Ford Algorithm 음수 weight 없음 Dijkstra Algorithm 출처: https://shnoh.tistory.com/15 BFS (너비 우선 탐색) 가장 단순한 형태입니다. weight가 없으니 depth가 곧 거리가 될 것이기 떄문에, 한 depth를 모두 살핀 후 그 다음 depth를 탐색하는 BFS를 통.. 2023. 1. 13.
[알고리즘] LIS 최장 증가 부분 수열, SegmentTree 최장 증가 부분 수열이란? A라는 수열ㄹ에서 연속되는 것과 상관없이 Ai < Aj (단, i < j)를 만족하는 부분 수열입니다. [10, 20, 10, 30, 20, 50] 위와 같이 수열이 주어졌을 때, [10, 20] [10, 20, 30] [10, 20, 30, 50] ... 모두 증가 부분 수열이며, 그 중 가장 길이가 긴 부분 수열이 최장 증가 부분 수열입니다. 어떻게 구하나? 동적계획법을 이용하여 구할 수 있습니다. 수열 A가 주어졌을 때, D(i)를 i번째 수를 부분 수열의 마지막으로하는 부분 수열 중 가장 길이가 긴 수열의 길이라고 한다면, D(i)는 Ai보다 앞에 있고 Ai보다 작은 Aj의 j에 대하여 D(j)가 가장 큰 값 + 1이될 것입니다. 즉 index 0부터 차례로 순회하며 D.. 2022. 10. 10.
[알고리즘] 재귀와 깊이 우선 탐색(DFS) 알고리즘 문제를 풀다가 재귀를 사용하는 방법이 흥미로워 정리해 놓으려 합니다. 이전 글에서 짧고 부족한 재귀를 이해하는 설명을 했습니다. 이번에는 여러 선택지가 있는 재귀에서 후퇴하는 방법입니다. 앞선 글에서 피보나치 수열을 예시로 설명을 했습니다. 그리고 이 수열의 표현식을 '점화식'이라고 하죠. N번째 항의 값은 그 이전 항(들)의 어떠한 로직으로 표현됩니다. 그런데 알고리즘에서는 이러한 일종의 점화식도 있습니다. N번째 항의 값은 N-1번째에 어떤 로직을 수행해서 이뤄지는데, 어떤 로직의 경우의 수가 2개 이상입니다. 예를 들어보겠습니다. 좋은 바코드 문제입니다. 1, 2, 3으로만 이루어진 수열 바코드를 만들어야 합니다. 이 바코드를 만드는 데에 조건이 걸려 있습니다. 바코드에서 인접한 두 부분 .. 2022. 7. 28.
[알고리즘] 재귀란, 느낌으로 이해하기 알고리즘 문제를 풀다가 재귀를 활용하는 방법이 어렵고 흥미로워서, 저처럼 재귀를 처음 접하며 혼란스러운 사람들에게 조금이나마 도움이 되고자합니다. 우선 제가 어렴풋이 느꼈던 재귀란 대충 이러합니다. 재귀는 같은 로직으로 조금씩 나누어 해결하는 것. 그리고, 나는 '초기값'과 '조금씩' 집중하고 나머지는 믿고 맡기는 것. 예를 들어 설명해보겠습니다. 아주 간단한 예시로는 피보나치 수열이 있습니다. 피보나치 수열은 이렇게 표현하죠. Fn = F(n-1) + F(n-2) ( F1 , F2 = 1) N번째 항은 이전 두 항을 더한 값이다. n-1, n-2번째 항을 구하기 위해서는 또 그들의 이전 값들을 더하고 또 더하는 것을 반복해야합니다. 즉, 같은 로직이 반복되고 있습니다. 그리고 중요하것은 이것입니다. '.. 2022. 7. 27.