본문 바로가기

알고리즘 이론32

최장 감소 수열 (LDS), 최장 증가 수열 (LIS) 최장 감소 수열 (LDS: Longest Decreasing Sequence)과 최장 증가 수열(LIS: Longest Increasing Sequence)에 대해 알아보겠습니다. 저는 코드를 최장 감소 수열에 대해서 짰기 때문에 최장 감소 수열을 설명하겠습니다. 최장 증가 수열과 최장 감소 수열은 증가하느냐 감소하느냐의 차이 밖에 없으므로 코드를 짤 때도 부등호 하나의 차이밖에 나지 않으므로 LDS만 이해한다면 LIS 또한 이해할 수 있을 것입니다. 최장 감소 수열이란 가장 긴 감소하는 부분 수열을 말합니다. 예를 들어서 살펴보도록 하겠습니다. 위와 같이 30, 40, 5, 15, 10, 20인 수열이 존재한다면 이 수열에 대해서 최장 감소 수열은 40, 15, 10이 됩니다. 사실 코드를 어떻게 짜느.. 2019. 6. 7.
힙 정렬(Heap sort) 힙 정렬(Heap sort)는 최대 힙과 최소 힙을 이용해서 정렬하는 방법입니다. N개의 자료들을 이용해서 먼저 힙을 만들고 루트를 삭제하면서 정렬합니다. 삭제된 루트 노드의 자료를 차례대로 배열에 넣어 정렬하므로 루트 노드에 어떤 수가 들어가냐에 따라 내림차순 정렬과 오름차순 정렬이 정해집니다. 최대 힙은 루트 노드에 가장 큰 수가 들어가고, 최소 힙은 루트 노드에 가장 작은 수가 들어가기 때문에 최대 힙을 이용하면 내림차순 정렬을 최소 힙을 이용하면 오름차순 정렬을 할 수 있습니다. (물론 루트노드 데이터를 배열에 거꾸로 넣으면 어떤 힙을 이용하든 내림차순 정렬, 오름차순 정렬 둘 다 가능합니다.) 4 5 3 6 7 2 1 데이터를 이용하여 최대힙을 만들고 이를 내림차순 정렬 해보겠습니다. 최대 히프.. 2019. 5. 30.
퀵 정렬(QuickSort) 재귀적 기준 키를 하나 두고 배열의 왼쪽에서부터(i)기준 키 보다 큰 값을 찾고 오른쪽에서부터는(j)작은 값을 찾아서 찾은 큰 값과 작은 값을 바꿔나간다.이 때 찾은 큰 값의index(i)가 작은 값의index(j)보다 크게 되는 경우(i>j)두 값을 바꾸지 않고 작은 값과 기준 키 값을 바꾼다.그렇게 하면 기준 키를 기준으로 왼쪽은 기준 키보다 작은 값이 오른쪽에는 기준 키보다 큰 값이 위치한다.즉,기준키는 정렬 된 후의 자리에 위치하게 된다.(기준키는 정렬 됨) 기준키(pivot, 4)를 정한다. i는 인덱스 0부터 올라가면서 기준 키 값보다 큰 수를 구하고 j는 배열의 마지막 인덱스부터 아래로 내려가면서 기준 키 값보다 작은 수를 구한다. 기준키보다 큰 수(i)와 오른쪽에서부터 기준키보다 작은 수(.. 2019. 5. 7.
병합 정렬 (Merge Sort) 병합 정렬은 분할 정복(Divide & Conquer)의 대표적인 예로 배열을 잘게 나누어서 다시 합칠 때 정렬하는 방법입니다. {8, 4, 6, 2, 1, 3, 5, 9, 10, 7} 인 배열을 병합 정렬 보겠습니다. 크기가 1인 배열이 될 때 까지 반으로 분할 하고, 이를 다시 합치면서(정복) 정렬하는 것이 병합 정렬입니다. 합치면서 정렬하는 방법에 대해 좀 더 상세히 알아보도록 하겠습니다. 배열 A : {4, 8} 과 B: {1, 2, 6}을 합쳐보도록 하겠습니다. 일단 배열의 크기가 1일 때부터 정렬하면서 합쳐주었으므로 배열 {4, 8}과 {1, 2, 6}은 정렬된 상태입니다. 그러므로 가장 앞에 수가 최솟값입니다. 각 배열을 인덱스 0부터 비교해가면서 작은 값을 배열의 0번째 값에 넣어줍니다. .. 2019. 4. 23.
삽입 정렬 (Insertion Sort) 삽입 정렬은 이미 정렬된 부분 배열에 현재 정렬하고자 하는 수를 삽입하여 정렬하는 알고리즘 입니다. 위의 그림과 같이 1~5번째 배열은 이미 배열이 된 상태고 6번째 수 4를 오름차순 정렬하는 경우를 살펴봅시다. 정렬하고자 하는 수 즉, 현재 단계에서 삽입하고자 하는 수는 4이므로 이를 5번째 배열 수부터 비교해갑니다. 5번째 수 7은 4보다 크니까 (7 > 4) 4는 7보다 앞으로 가야 합니다. 따라서 7을 뒤로 한 칸 옮겨줍니다. 4번째 수 6도 4보다 크니까 (6 > 4) 4는 6보다 앞으로 가야 합니다. 따라서 6을 뒤로 한 칸 옮겨줍니다.3번째 수 5도 마찬가지로 4보다 크니까 (5 > 4) 5를 뒤로 한 칸 옮겨줍니다. 2번째 수 3은 4보다 작습니다.(3 < 4) 따라서 4는 3 바로 뒤인 .. 2019. 4. 18.
선택 정렬 (Selection Sort) 선택 정렬은 단계별로 최대값이나 최소값을 찾아서 배열의 뒤로 보내서 정렬하는 알고리즘 입니다. 이 때, 최대값을 뒤로 보낼 경우 오름차순 정렬, 최소값을 뒤로 보낼 경우 내림차순 정렬이 됩니다. "4 5 3 6 7 2 1"인 배열을 선택 정렬로 오름차순 정렬해보겠습니다. 최대값을 찾기 위해서 배열의 앞에서부터 배열을 탐색합니다. 일단 첫번째 요소인 4가 최대값이 됩니다. 2번째 배열 요소인 5는 현재 최대값인 4보다 크므로 최대값을 5로 갱신합니다. 3번째 요소인 3은 현재 최대값인 5보다 작으므로 다음 배열요소를 비교합니다. 이와 같은 방법으로 정렬되지 않은 배열의 마지막 요소까지 탐색, 비교하여 최대값을 찾으면 최대값은 7이되고 이를 정렬되지 않은 배열의 마지막 위치와 바꿔줍니다. (7과 1 교환) .. 2019. 4. 15.