<청춘> 격정적으로 사는 것

밤을 새고 공부한 다음 날 새벽에 느꼈던 생생한 환희와 야생적인 즐거움을 잊을 수 없다

자료구조 알고리즘 13

[알고리즘] 위상 정렬 (Topology Sort) : 순서가 정해져 있는 정렬 알고리즘

위상 정렬 (Topology Sort) 순서가 정해져 있는 일련의 작업을 차례대로 수행해야 할 때 사용할 수 있는 알고리즘이다. 혹은 방향 그래프의 모든 노드를 '방향성에 거스르지 않도록 순서대로 나열하는 것' 이다. 진입차수 (Indegree) 특정한 노드로 들어오는 간선의 개수 알고리즘 1. 진입차수가 0인 노드를 큐에 넣는다. 2. 큐가 빌 때까지 다음의 과정을 반복한다. 2-1. 큐에서 원소를 꺼내 해당 노드에서 출발하는 간선을 그래프에서 제거한다. 2-2. 새롭게 진입차수가 0이 된 노드를 큐에 넣는다. 이때 모든 원소를 방문하기 전에, 즉 원소가 V번 추출되기 전에 큐가 비어버리면 사이클이 발생한 것이다. 예제 step 0 진입차수가 0인 노드를 큐에 넣는다. 노드 1 2 3 4 5 진입차수 ..

[알고리즘] 신장트리 / 크루스칼 알고리즘 : 최소 신장 트리 알고리즘

신장트리 (Spanning Tree) 하나의 그래프가 있을 때 모든 노드를 포함하면서 사이클이 존재하지 않는 부분 그래프를 의미한다. 이때 모든 노드가 포함되어 서로 연결되면서 사이클이 존재하지 않는다는 조건은 트리의 성립조건이기도 하다. 예를 들어 다음과 같은 그래프가 있다고 하자. 위의 그래프에서 가능한 신장 트리는 다음과 같다. (여러개 존재 가능) 다음은 신장 트리가 될 수 없다. 사이클이 존재하기 때문이다. 다음도 신장 트리가 될 수 없다. 노드 2를 포함하고 있지 않기 때문이다. 최소 신장 트리 알고리즘 신장 트리 중에서 최소 비용으로 만들 수 있는 신장트리를 찾는 알고리즘을 말한다. 최소 신장 트리의 간선의 개수는 '노드의 개수 - 1'이다. 대표적인 최소 신장 트리 알고리즘으로는 크루스칼 ..

[그래프 이론] 서로소 집합 자료구조/ /서로소 집합을 활용한 사이클 판별

2021.07.30 - [자료구조 알고리즘] - [알고리즘] 그래프 이론/ 서로소 집합/ 서로소 집합 자료구조/ [알고리즘] 그래프 이론/ 서로소 집합/ 서로소 집합 자료구조/ 들어가기 전 DFS/BFS와 최단경로는 모두 그래프 알고리즘의 한 유형으로 볼 수 있다. 그래프란? 노드와 노드 사이에 연결된 간선의 정보를 가지고 있는 자료구조이다. 알고리즘 문제를 접했을 때 devmath.tistory.com 서로소 집합을 활용한 사이클 판별 서로소 집합은 다양한 알고리즘에 사용될 수 있는데, 특히 무방향 그래프 내에서의 사이클을 판별할 때 사용할 수 있다. 사이클 (정리중) 예제 {1, 2, 3} union 1, 2 union 1, 3 union 2, 3 step 0 (초기 단계) 초기 단계에서는 모든 노드..

[알고리즘] 그래프 이론/ 서로소 집합/ 서로소 집합 자료구조/

들어가기 전 DFS/BFS와 최단경로는 모두 그래프 알고리즘의 한 유형으로 볼 수 있다. 그래프란? 노드와 노드 사이에 연결된 간선의 정보를 가지고 있는 자료구조이다. 알고리즘 문제를 접했을 때 서로 다른 개체가 연결되어 있다는 말이 있으면 가장 먼저 그래프 알고리즘을 떠올려야한다. 예를 들어 '여러 개의 도시가 연결되어 있다'와 같은 내용이 등장하면 그래프 알고리즘을 의심해보자. 2021.05.27 - [자료구조 알고리즘] - [자료구조] 그래프 (Graph) [자료구조] 그래프 (Graph) 그래프 (Graph) 그래프는 노드(Node) 와 간선(Edge)으로 표현된다. 노드 (Node) : 정점(Vertex) 간선 (Edge) : 정점과 정점을 연결하는 선 그래프 탐색 그래프 탐색이란 하나의 노드를..

[알고리즘] 최단 경로 : 모든 지점에서 다른 모든 지점까지의 최단 경로 / 플로이드 워셜 알고리즘 (Floyd-Warshall Algorithm) / 파이썬

최단 경로 (Shortest Path) 가장 짧은 경로를 찾는 알고리즘 '길 찾기' 문제라고도 불린다. 보통 그래프를 이용해 표현한다. 다익스트라 알고리즘 vs 플로이드 워셜 알고리즘 다익스트라 알고리즘 한 지점에서 다른 특정 지점까지의 최단 경로를 구해야 하는 경우에 사용한다. 단계마다 최단 거리를 가지는 노드를 하나씩 반복적으로 선택한다. 그리고 해당 노드를 거쳐 가는 경로를 확인하며, 최단 거리 테이블을 갱신한다. 출발 노드가 1개이므로 다른 모든 노드까지의 최단 거리를 저장하기 위해 1차원 리스트를 이용한다. 다익스트라 알고리즘은 그리디 알고리즘이다. 2021.07.27 - [파이썬 Python] - [알고리즘] 최단 경로 : 특정 지점까지 가장 빠르게 도달하는 방법을 찾는 알고리즘 / 다익스트라..

[알고리즘] 소수의 판별 / 약수 / 에라토스테네스의 체 / 파이썬

소수 (Prime Number) 2보다 큰 자연수 중에서 1과 자기 자신을 제외한 자연수로는 나누어떨어지지 않는 자연수이다. 단, 1은 소수가 아니다. 예) 6은 1,2,3,6 으로 나누어떨어진다. 따라서 6은 소수가 아니다. 하지만 7은 1과 7을 제외하고는 나누어떨어지지 않는다. 따라서 7은 소수이다. 소수 판별법 가장 먼저 어떠한 수 X가 주어졌을 때 해당 수가 소수인지 아닌지 판별하는 방법에 대해서 살펴보자. 가장 간단한 방법은 X를 2부터 X-1까지의 모든 수로 나누어보는 것이다. 만약 2부터 X-1까지의 모든 자연수로 나누었을 때 나누어떨어지는 수가 하나라도 존재한다면 X는 소수가 아니다. 코드 # 소수 판별 함수 def is_prime_number(x): # 2부터 (x-1)까지의 모든 수를..

다이나믹 프로그래밍 (Dynamic Programming) / 동적계획법 - 한 번 계산한 문제는 다시 계산하지 않도록 하는 알고리즘

컴퓨터를 활용해도 해결하기 어려운 문제? 최적의 해를 구하기에 시간이 매우 많이 필요한 문제 - 컴퓨터 연산 속도에 한계가 있음 메모리 공간이 매우 많이 필요한 문제 - 메모리 공간을 사용할 수 있는 데이터의 개수가 한정적 다만, 어떤 문제는 메모리 공간을 약간 더 사용하면 연산 속도를 비약적으로 증가시킬 수 있다. → 다이나믹 프로그래밍 (Dynamic Programming) / 동적계획법 피보나치 수열 다이나믹 프로그래밍으로 해결할 수 있는 대표적인 예시로 피보나치 수열이 있다. 피보나치 수열은 이전 두 항의 합을 현재의 항으로 설정하는 수열이다. 1 1 2 3 5 8 13 21 34 55 89 ... 점화식이란 인접한 항들 사이의 관계식으로, 점화식을 이용해 수열을 간결하게 표현할 수 있다. 피보나..

[알고리즘] Greedy Algorithm 탐욕 알고리즘 / 파이썬

탐욕 알고리즘 (Greedy Algorithm) 최적 해를 구하는데 사용되는 근시안적인 방법 탐욕적이라는 말은 '현재 상황에서 지금 당장 좋은 것만 고르는 방법'을 의미한다. 그리디 알고리즘을 이용하면 매 순간 가장 좋아보이는 것을 선택하며, 현재의 선택이 나중에 미칠 영향에 대해서는 고려하지 않는다. 여러 경우 중 하나를 결정해야 할 때마다 그 순간에 최적이라고 생각되는 것을 선택해 나가는 방식으로 진행하여 최종적인 해답에 도달한다. 각 선택의 시점에서 이루어지는 결정은 지역적으로는 최적이지만, 그것들을 계속 수집하여 최종적인 해답을 만들었다고 하여, 그것이 최적이라는 보장은 없다. 탐욕 알고리즘 수행 과정 1. 해 선택 현재 상태에서 부분 문제의 최적 해를 구한 뒤, 이를 부분 해 집합에 추가한다. ..

[자료구조 알고리즘] 순차 탐색 / 이진 탐색 / 트리(Tree) / 이진 탐색 트리

순차 탐색 (Sequential Search) 순차 탐색이란 리스트 안에 있는 특정한 데이터를 찾기 위해 앞에서부터 데이터를 하나씩 차례대로 확인하는 방법이다. 보통 정렬되지 않은 리스트에서 데이터를 찾아야 할 때 사용한다. 리스트에 특정 값의 원소가 있는지 체크할 때도 순차 탐색으로 원소를 확인하고, 리스트 자료형에서 특정한 값을 가지는 원소의 개수를 세는 count() 메서드를 이용할 때도 내부에서는 순차 탐색이 수행된다. 순차 탐색 소스코드 def sequential_search(n, target, array): # 각 원소를 하나씩 확인하며 for i in range(n): # 현재의 원소가 찾고자 하는 원소와 동일한 경우 if array[i] == target: return i + 1 # 현재의..

[알고리즘] 정렬 (Sorting) / 코드 Python / 선택정렬, 삽입정렬, 퀵정렬, 계수정렬

정렬 (Sorting) 정렬이란 데이터를 특정한 기준에 따라서 순서대로 나열하는 것을 말한다. 선택 정렬 (Selection Sort) 선택 정렬은 여러 개의 데이터가 있을 때, 가장 작은 데이터를 선택해 맨 앞에 있는 데이터와 바꾸고, 그다음 작은 데이터를 선택해 앞에서 두 번째 데이터와 바꾸는 과정을 반복해서 전체 데이터를 정렬하는 알고리즘이다. 매번 가장 작은 것을 선택 한다는 의미에서 선택 정렬이라고 한다. 예) 데이터의 개수 N = 4 빨간색 - 가장 작은 데이터 초록색 - 정렬 완료된 데이터 step1 6 2 8 4 step2 2 6 8 4 step3 2 4 8 6 step4 2 4 6 8 이처럼 선택 정렬은 가장 작은 데이터를 앞으로 보내는 과정을 N-1번 반복하면 정렬이 완료된다. 선택 정..