본문 바로가기
728x90
반응형

Computer Science/알고리즘8

구간합 배열(Prefix Sum) 구간합 배열이란 만약 N개의 값으로 이루어진 배열이 주어졌을 때, 부분 배열의 합을 구하려면 반복문을 돌리면 O(N)이 걸리지만, 구간합 배열을 사용하면 O(1)에 구할 수 있다. 구간합 배열 설명 Sum 배열은 N 또는 N+1로 이루어진 배열이다. 위의 그림은 N으로 되어있다. P[0]은 A[0]과 같다. 그 다음 P[1]은 P[0] + A[1] P[2]는 P[1] + A[2] P[3]은 P[2] + A[3] 으로 구할 수 있다. 이처럼 반복문을 사용한다면, 하나씩 더해야 할 것을 구간합 배열을 사용하면 O(1)에 구할 수 있다. 만약 A[1] + A[2]를 구하고 싶다면 어떻게 하면 될까? P[2] - P[0] 이 된다. P[2] - P[0] = (A[0] + A[1] + A[2]) - A[0] 이기.. 2023. 7. 5.
이분탐색(Binary Search) 이분탐색이란 이분탐색은 N개의 정렬된 수들 중 어떤 값 K의 위치를 찾아내거나, 없다는 것을 판정하는 탐색을 말한다. 이분탐색은 O(logN)의 시간 복잡도를 가지고 있다. 이분탐색 설명 위의 그림을 보자. N=10인 배열에서 23을 찾으려고 한다. 이때 중간값은 홀수인 경우, 반올림, 반내림하여도 상관없다. 어쨌거나 절반에 가깝기 때문. 1단계 이제 이 중간값이 23보다 크거나, 작은지, 같은지를 검사한다. 여기서는 중간값은 16이기 때문에, 23보다 작고, 왼쪽에는 찾으려는 값이 없다는 것을 확실히 알 수 있다. 그럼 이제 오른쪽을 검사한다. 2단계 오른쪽에서 중간값은 56이다. 23보다 크기 때문에, 오른쪽은 더이상 볼 필요가 없다. 3단계 다음 중간값은 38이다. (혹은 23이 되어서, 바로 값을.. 2023. 7. 5.
분할 정복(Divide And Conquer) 분할 정복 분할 정복 알고리즘이란 말 그대로, 1. 분할 2. 정복 순으로 해결하는 것을 말한다. 큰 덩어리의 문제를 분할해서 점점 작은 덩어리로 만들어 간다. 그러다가 충분히 분할되서 풀기 쉬워질 정도가 되면, 그때부터 하나씩 정복해 나간다. 그리고 작은 문제들을 하나씩 합쳐가면서, 큰 문제로 조립해나간다. 그렇게 처음 해결하려고 했던 문제까지 올라가서 결과를 도출한다. 분할 정복은 언제 사용해야 할까? 답은 그냥 풀었을 때보다 분할하고 합치면서 풀었을 경우에 월등히 연산속도가 빠른 경우에 사용한다. 분할 정복 알고리즘 수행시간 계산법 1. 나누어지는 문제의 개수 2. 분할 후 문제의 크기 3. 각 문제마다 병합(정복) 단계에서 걸리는 시간 만약, 병합 정렬을 예로 들면, 1은 2, 2는 N/2, 3은.. 2023. 6. 17.
BFS(Breadth-First Search) BFS(Breadth-First Search) 너비 우선 탐색. 이름 그대로 그래프에서 넓은 부분을 우선적으로 탐색하는 알고리즘을 말한다. BFS의 탐색 순서 BFS는 A에서 출발해서 A에서 인접한 노드인 B, C부터 우선적으로 모두 탐색한다. 그 다음 B, C에서 인접한 노드인 D, E, F, G. 그 다음 F, G는 마지막 노드이니, D, E에서 인접한 노드인 H, I, J를 하나씩 탐색하면 모든 노드의 탐색이 끝나게 된다. 이때, 각 단계의 노드들은 그 안에서 방문 순서가 바뀔 수는 있지만, 다른 단계의 노드와는 방문 순서가 바뀔 수 없다. 여기서 가장 처음 시작하는 0단계 노드에서 K단계 노드까지는 최단거리가 K가 된다. 최단거리는 즉, A에서 마지막 노드까지 가는 데 필요한 간선의 최소 개수와 .. 2023. 5. 19.
DFS(Depth-First Search) DFS(Depth-First Search) 깊이 우선 탐색. 이름 그대로 그래프에서 깊은 부분을 우선적으로 탐색하는 알고리즘을 말한다. 정확하게는 DFS는 깊은 부분을 끝까지 탐색하다가, 막히면 다시 돌아와서, 다른 부분을 깊게 탐색한다. DFS의 탐색 순서 DFS는 A에서 출발해서 B를 선택하여 탐색을 시작하고, B에서 이미 A는 탐색했으니, D로 넘어간다. 그리고 D에서는 이미 B를 탐색했으니, H로 넘어가게 되고, 이제 더 이상 방문할 인접 노드가 없는 H에서는 자신의 앞전 노드인 D로 돌아가고, 방문할 수 있는 노드인 I로 이동한다. 그리고 I는 거꾸로 D로 돌아가고, 이제 더 이상 방문할 노드가 없으니, B로, 그 다음은 A로 거슬러 올라간다. 그리고 A에서는 이제 반대편 노드를 탐색하기 시작하.. 2023. 5. 19.
그리디 알고리즘(Greedy Algorithm) 서론 영단어 greedy의 의미는 "탐욕스럽다"이다. 즉, 그리디 알고리즘이란, 탐욕스러운 사람처럼 눈앞에 보이는 이익만 쫓아가는 알고리즘을 뜻한다. 그리디 알고리즘이란 위와 같은 트리 구조에서, 왼쪽 노드로 가는 것이 가장 좋은 경로이지만 당장의 탐욕스러움으로 오른쪽 노드로 가는 것. 이러한 트리 탐색 알고리즘을 그리디 알고리즘이라고 한다. 언제 사용할까? 그리디 알고리즘은 * 동전 개수를 최소로 사용하는 문제. (가장 큰 금액의 동전을 많이 사용하면 된다) * 도시락을 하나씩만 데울 수 있는데, 먹는 시간을 최소화해야 하는 문제. (먹는 데 가장 오래 걸리는 도시락부터 데우면 된다) 와 같은 문제에서 유용하게 쓰일 수 있다. 2023. 5. 18.
728x90
반응형