알고리즘
-
이번 시간에는 쉘 정렬(Shell Sort)에 대해서 배워볼 것입니다. 1. 셸 정렬이란? 셸 정렬은 삽입 정렬의 성질을 이용하고 이를 보완한 삽입 정렬의 일반화 버전이라고 볼 수 있습니다. 삽입 정렬의 설명은 이곳을 참조 삽입 정렬의 특징은 다음과 같은 것이 있었습니다. 입력되는 초기 리스트가 거의 정렬되어 있을 경우에만 효율적으로 사용 가능하다. 한 번에 한 요소의 위치만 결정 되기 때문에 비효율적이다. 이러한 삽입 정렬의 장점은 뽑아 먹고 단점은 보완한 것이 셸 정렬입니다. 그래서 셸 정렬은 기존의 삽입 정렬을 수행하기 전에 전체 데이터를 거의 정렬된 상태로 만들면 기존의 삽입 정렬을 그대로 처음부터 사용하는 것보다 더 좋은 성능을 발휘할 수 있다는 점에서 착안된 것입니다. 우선 셸 정렬은 Memo..
[Algorithm | Java] Shell Sort(셸 정렬) 알고리즘이번 시간에는 쉘 정렬(Shell Sort)에 대해서 배워볼 것입니다. 1. 셸 정렬이란? 셸 정렬은 삽입 정렬의 성질을 이용하고 이를 보완한 삽입 정렬의 일반화 버전이라고 볼 수 있습니다. 삽입 정렬의 설명은 이곳을 참조 삽입 정렬의 특징은 다음과 같은 것이 있었습니다. 입력되는 초기 리스트가 거의 정렬되어 있을 경우에만 효율적으로 사용 가능하다. 한 번에 한 요소의 위치만 결정 되기 때문에 비효율적이다. 이러한 삽입 정렬의 장점은 뽑아 먹고 단점은 보완한 것이 셸 정렬입니다. 그래서 셸 정렬은 기존의 삽입 정렬을 수행하기 전에 전체 데이터를 거의 정렬된 상태로 만들면 기존의 삽입 정렬을 그대로 처음부터 사용하는 것보다 더 좋은 성능을 발휘할 수 있다는 점에서 착안된 것입니다. 우선 셸 정렬은 Memo..
2022.12.28 -
이번 시간에는 위상정렬에 대해서 배워 보도록 하겠습니다. 1. 위상 정렬이란? 어떤 일을 하는 순서를 찾는 알고리즘으로 방향 그래프에 존재하는 각 정점들의 선행 순서를 위배하지 않으면서 모든 정점(vertex)을 나열하는 것을 말합니다. 그래프가 DAG가 아닌 경우 그래프에 대한 위상 정렬은 불가능합니다. 비순환 방향 그래프(DAG: Directed Acyclic Graph)에서 정점을 선형으로 정렬하는 것(순서대로 출력) 즉, 순서가 있는 task에서 순서를 찾아주는 알고리즘으로 보시면 됩니다. 그래프 방문 결과가 순서대로 출력 되어야 하기 때문에 그래프의 시작 지점과 방향이 존재해야 하고, 그래프에 cycle이 있으면 위상 정렬로 sorting(정렬)하는 것이 불가능합니다. 리스트와 같은 경우 그 자..
[Algorithm | Java] Topological Sorting(위상 정렬) 알고리즘이번 시간에는 위상정렬에 대해서 배워 보도록 하겠습니다. 1. 위상 정렬이란? 어떤 일을 하는 순서를 찾는 알고리즘으로 방향 그래프에 존재하는 각 정점들의 선행 순서를 위배하지 않으면서 모든 정점(vertex)을 나열하는 것을 말합니다. 그래프가 DAG가 아닌 경우 그래프에 대한 위상 정렬은 불가능합니다. 비순환 방향 그래프(DAG: Directed Acyclic Graph)에서 정점을 선형으로 정렬하는 것(순서대로 출력) 즉, 순서가 있는 task에서 순서를 찾아주는 알고리즘으로 보시면 됩니다. 그래프 방문 결과가 순서대로 출력 되어야 하기 때문에 그래프의 시작 지점과 방향이 존재해야 하고, 그래프에 cycle이 있으면 위상 정렬로 sorting(정렬)하는 것이 불가능합니다. 리스트와 같은 경우 그 자..
2022.12.28 -
이번 시간에는 그리디 알고리즘에 대해서 배워 볼 것입니다. 1. 그리디(탐욕) 알고리즘이란? 단어에서 알 수 있듯이 'Greedy'라는 단어가 '탐욕스러운', '욕심 많은' 이라는 뜻을 내포하고 있습니다. 그래서 말 그래도 선택의 순간마다 당장 눈 앞에 보이는 최적의 상황만을 쫓아 최종 답에 도달하는 알고리즘입니다. 최적해를 구하는 데 사용되는 근사적인 방법이며, 여러 경우 중 하나를 결정해야 할 때마다 그 순간에 최적이라고 생각이 드는 것을 선택해 나가는 방식입니다다. 매 선택에서 현재 당장 최적인 값이다. 그렇지만 그리디 알고리즘은 전체에서 최적값을 언제나 구할 수는 없습니다. 다음과 같은 그래프를 봅시다. A에서 출발하여 E에 가야한다고 할 때 경우의 수는 다음과 같습니다. 먼저 B or C or ..
[Algorithm | Java] Greedy Algorithm(그리디 알고리즘)이번 시간에는 그리디 알고리즘에 대해서 배워 볼 것입니다. 1. 그리디(탐욕) 알고리즘이란? 단어에서 알 수 있듯이 'Greedy'라는 단어가 '탐욕스러운', '욕심 많은' 이라는 뜻을 내포하고 있습니다. 그래서 말 그래도 선택의 순간마다 당장 눈 앞에 보이는 최적의 상황만을 쫓아 최종 답에 도달하는 알고리즘입니다. 최적해를 구하는 데 사용되는 근사적인 방법이며, 여러 경우 중 하나를 결정해야 할 때마다 그 순간에 최적이라고 생각이 드는 것을 선택해 나가는 방식입니다다. 매 선택에서 현재 당장 최적인 값이다. 그렇지만 그리디 알고리즘은 전체에서 최적값을 언제나 구할 수는 없습니다. 다음과 같은 그래프를 봅시다. A에서 출발하여 E에 가야한다고 할 때 경우의 수는 다음과 같습니다. 먼저 B or C or ..
2022.12.28 -
이번 시간에는 그래프 탐색 방법 중 너비 우선 탐색(BFS)에 대해서 배워볼 것입니다. 1. 그래프 탐색이란 하나의 정점으로붙 시작하여 차례대로 모든 정점들을 한 번씩 방문하는 것 EX) 특정 도시에서 다른 도시로 갈 수 있는 지 없는 지, 전자 회로에서 특정 단자와 단자가 서로 연결 되어 있는 지 그래프는 탐색하는 동안 동일한 정점으로 다시 이동할 수 있는 싸이클이 있을 수 있습니다. 그래서 동일한 정점이 다시 처리되지 않도록 하려면 처리 후 정점을 방문(visited)했다는 표시를 함으로써 중복 방문을 피하도록 하는 것이 그래프 탐색의 핵심입니다. Queue를 이용하여 구현 2. BFS (Breath-First Search, 너비 우선 탐색 ) DFS는 그래프의 개념이 반드시 선행되어야 하기 때문에 ..
[Algorithm | Java] 너비 우선 탐색(BFS)(그래프 탐색) 알고리즘이번 시간에는 그래프 탐색 방법 중 너비 우선 탐색(BFS)에 대해서 배워볼 것입니다. 1. 그래프 탐색이란 하나의 정점으로붙 시작하여 차례대로 모든 정점들을 한 번씩 방문하는 것 EX) 특정 도시에서 다른 도시로 갈 수 있는 지 없는 지, 전자 회로에서 특정 단자와 단자가 서로 연결 되어 있는 지 그래프는 탐색하는 동안 동일한 정점으로 다시 이동할 수 있는 싸이클이 있을 수 있습니다. 그래서 동일한 정점이 다시 처리되지 않도록 하려면 처리 후 정점을 방문(visited)했다는 표시를 함으로써 중복 방문을 피하도록 하는 것이 그래프 탐색의 핵심입니다. Queue를 이용하여 구현 2. BFS (Breath-First Search, 너비 우선 탐색 ) DFS는 그래프의 개념이 반드시 선행되어야 하기 때문에 ..
2022.12.28 -
이번 시간에는 다익스트라 라는 최단 거리를 알아내는 알고리즘에 대해 배워 보도록 하겠습니다. 1. Dijkstra Algorithm - 다익스트라 알고리즘이란? 그래프에서 최단 경로를 찾아내는 알고리즘은 많이 나와있지만 그 중에서 가장 기본이 되는 알고리즘을 뜻함. 다른 최단 거리 알고리즘은 다익스트라를 기반으로 나온 알고리즘입니다. 다익스트라 알고리즘에 대해 미리 조금 살펴보자면 다음과 같은 것들이 존재합니다. 한 vertex에서 다른 vertex까지의 최단 경로이다. Edge의 가중치(weight)은 양수만 가능(음수 불가능)하다. 가중치에 음수가 있는 경우에는 Bellman-Ford's algorithm(벨만-포드 알고리즘) 혹은 Floyd-Warshall(플로이드-워셜) 알고리즘을 사용한다. 대부..
[Algorithm | Java] Dijkstra Algorithm(다익스트라 알고리즘)이번 시간에는 다익스트라 라는 최단 거리를 알아내는 알고리즘에 대해 배워 보도록 하겠습니다. 1. Dijkstra Algorithm - 다익스트라 알고리즘이란? 그래프에서 최단 경로를 찾아내는 알고리즘은 많이 나와있지만 그 중에서 가장 기본이 되는 알고리즘을 뜻함. 다른 최단 거리 알고리즘은 다익스트라를 기반으로 나온 알고리즘입니다. 다익스트라 알고리즘에 대해 미리 조금 살펴보자면 다음과 같은 것들이 존재합니다. 한 vertex에서 다른 vertex까지의 최단 경로이다. Edge의 가중치(weight)은 양수만 가능(음수 불가능)하다. 가중치에 음수가 있는 경우에는 Bellman-Ford's algorithm(벨만-포드 알고리즘) 혹은 Floyd-Warshall(플로이드-워셜) 알고리즘을 사용한다. 대부..
2022.12.28 -
이번 시간에는 다이나믹 프로그래밍(동적 계획법 ,DP)에 대해서 배워 보도록 하겠습니다. 1. 다이나믹 프로그래밍이란? Dynamic Programming 줄여서 DP(또는 동적 계획법)는 특정 범위까지의 값을 구하기 위해서 그것과 다른 범위까지의 값을 이용하여 효율적으로 값을 구하는 알고리즘 설계 기법입니다. 위의 말을 쉽게 풀자면 아래와 같이 정리할 수 있습니다. 하나의 큰 문제를 여러 개의 작은 문제로 나누어 그 결과를 저장하여 다시 큰 문제를 해결할 때 사용하는 것 큰 문제를 작은 문제로 쪼개서 그 답을 저장해 두었다가 재활용(기억하며 풀기) 2. 왜 DP를 쓰는 것일까? 사실 일반적인 재귀(Naive Recursion)방식 또한 DP와 매우 유사하다고 볼 수 있는데, 차이점은 일반적인 재귀를 단..
[Algorithm | Java] Dynamic Programming(다이나믹 프로그래밍) 알고리즘이번 시간에는 다이나믹 프로그래밍(동적 계획법 ,DP)에 대해서 배워 보도록 하겠습니다. 1. 다이나믹 프로그래밍이란? Dynamic Programming 줄여서 DP(또는 동적 계획법)는 특정 범위까지의 값을 구하기 위해서 그것과 다른 범위까지의 값을 이용하여 효율적으로 값을 구하는 알고리즘 설계 기법입니다. 위의 말을 쉽게 풀자면 아래와 같이 정리할 수 있습니다. 하나의 큰 문제를 여러 개의 작은 문제로 나누어 그 결과를 저장하여 다시 큰 문제를 해결할 때 사용하는 것 큰 문제를 작은 문제로 쪼개서 그 답을 저장해 두었다가 재활용(기억하며 풀기) 2. 왜 DP를 쓰는 것일까? 사실 일반적인 재귀(Naive Recursion)방식 또한 DP와 매우 유사하다고 볼 수 있는데, 차이점은 일반적인 재귀를 단..
2022.12.28 -
이번 시간에는 그래프 탐색 방법 중 깊이 우선 탐색(DFS)에 대해서 배워볼 것입니다. 1. 그래프 탐색이란하나의 정점으로부터 시작하여 차례대로 모든 정점들을 한 번씩 방문하는 것EX) 특정 도시에서 다른 도시로 갈 수 있는 지 없는 지, 전자 회로에서 특정 단자와 단자가 서로 연결 되어 있는 지그래프는 탐색하는 동안 동일한 정점으로 다시 이동할 수 있는 싸이클이 있을 수 있습니다. 그래서 동일한 정점이 다시 처리되지 않도록 하려면 처리 후 정점을 방문(visited)했다는 표시를 함으로써 중복 방문을 피하도록 하는 것이 그래프 탐색의 핵심입니다. 2. DFS (Depth-First Search, 깊이 우선 탐색 )DFS는 그래프의 개념이 반드시 선행되어야 하기 때문에 다음 포스트를 먼저 확인하길 바랍니..
[Algorithm | Java] 깊이 우선 탐색(DFS) (그래프 탐색) 알고리즘이번 시간에는 그래프 탐색 방법 중 깊이 우선 탐색(DFS)에 대해서 배워볼 것입니다. 1. 그래프 탐색이란하나의 정점으로부터 시작하여 차례대로 모든 정점들을 한 번씩 방문하는 것EX) 특정 도시에서 다른 도시로 갈 수 있는 지 없는 지, 전자 회로에서 특정 단자와 단자가 서로 연결 되어 있는 지그래프는 탐색하는 동안 동일한 정점으로 다시 이동할 수 있는 싸이클이 있을 수 있습니다. 그래서 동일한 정점이 다시 처리되지 않도록 하려면 처리 후 정점을 방문(visited)했다는 표시를 함으로써 중복 방문을 피하도록 하는 것이 그래프 탐색의 핵심입니다. 2. DFS (Depth-First Search, 깊이 우선 탐색 )DFS는 그래프의 개념이 반드시 선행되어야 하기 때문에 다음 포스트를 먼저 확인하길 바랍니..
2022.12.28 -
이번시간에는 퀵 정렬에 대해서 배워 보도록 하겠습니다. 저번 포스팅에서 설명했던 정렬 방식들(버블 정렬, 삽입 정렬, 선택 정렬) 은 가장 기본적인 수준의 정렬 방식들입니다. 그러나 이것들은 일반적으로 좋은 성능은 낼 수 없기때문에 실제로 개발 시에는 잘 사용하지 않습니다. 앞으로 배울 Merge / Quick 정렬은 굉장히 중요하기 때문에 자세히 알아보도록 하겠습니다. 1. 퀵 정렬이란? 먼저 퀵정렬의 특징은 다음과 같습니다. 퀵 정렬(Quick Sort)은 합병 정렬(Merge Sort)과 마찬가지로 배열을 둘 씩 분할하며 정렬하는 과정을 거치기 때문에 시간복잡도 O(nlog2n)을 갖습니다. 하지만 같은 시간 복잡도라도 실제 정렬에서는 합병 정렬보다 퀵 정렬이 훨씬 더 빠른 시간 안에 정렬이 가능합..
[Algorithm | Java] Quick Sort(퀵 정렬)이번시간에는 퀵 정렬에 대해서 배워 보도록 하겠습니다. 저번 포스팅에서 설명했던 정렬 방식들(버블 정렬, 삽입 정렬, 선택 정렬) 은 가장 기본적인 수준의 정렬 방식들입니다. 그러나 이것들은 일반적으로 좋은 성능은 낼 수 없기때문에 실제로 개발 시에는 잘 사용하지 않습니다. 앞으로 배울 Merge / Quick 정렬은 굉장히 중요하기 때문에 자세히 알아보도록 하겠습니다. 1. 퀵 정렬이란? 먼저 퀵정렬의 특징은 다음과 같습니다. 퀵 정렬(Quick Sort)은 합병 정렬(Merge Sort)과 마찬가지로 배열을 둘 씩 분할하며 정렬하는 과정을 거치기 때문에 시간복잡도 O(nlog2n)을 갖습니다. 하지만 같은 시간 복잡도라도 실제 정렬에서는 합병 정렬보다 퀵 정렬이 훨씬 더 빠른 시간 안에 정렬이 가능합..
2022.12.28