본문 바로가기

알고리즘/Sort6

[Sort] 프로그래머스 - 가장 큰 수 1차 시도 사고 과정 - 틀림 가장 최고자리 수를 기준으로 정렬을 하여 모든 것들을 Concat하자 가장 최고자리 수를 찾기위해 1보다 작아질 때까지 각 수를 나누고 그것을 딕셔너리에 IDx값과 함께 넣자 {'Index' : 3, 'top_num' : 9} 이런식으로 넣은 후 key를 최고 자리수로 하여서 정렬시키자 -> [3, 30, 34, 5, 9]일 때의 생각울 못했다! 최고자리가 같은 애들이 여러개일 경우 두번째 자리 기준으로 비교가 다시한번 들어가야 한다는 점을 간과하여 틀렸다 2차 시도 사고 과정 - 반은 맞음 numbers에 들어간 값들을 모두 STring으로 변환시키자 모든 원소는 0~1000까지의 수이므로 3자리 수가 대부분이다. 3, 34, 32가 있다면 34, 3, 32 순으로 정렬이.. 2021. 9. 17.
[Sort] 퀵 정렬 - Quick Sort 기준(Pivot)을 두고 기준 왼쪽에는 작은 수들을, 기준 오른쪽에는 큰 수들을 놓는다. 이러한 과정을 기준을 제외하고 왼쪽 부분(기준보다 작은 아이들) / 오른쪽 부분(기준보다 큰 아이들)에 똑같이 적용하여 반복한다 Pivot을 기준으로 작/큰 분류 - Tree 처럼 반복 / swap 시 Index 범위 조심! 주의 오른쪽부터 탐색하는 포인터(코드에서는 right)가 arr의 범위를 넘어가지 않는 포인터이다. pivot을 항상 맨 첫번째 Idx로 정하기 때문이다. 모두 정렬이 되어있는 경우 왼쪽부터 탐색하는 포인터(코드에서는 left)는 arr의 범위를 넘어간다. 따라서 left와 right가 교차했을 시에, right 자리를 pivot과 swap해주어야 기준이 중간으로 범위 벗어난 문제 없이 이동할 .. 2021. 9. 12.
[Sort] 삽입정렬 - Insertion Sort 앞에 있는 array들이 정렬되어있고 현재 위치의 값을 앞 정렬된 array 중, 알맞은 곳에 삽입하는 방법 -> 코드화 하면 삽입보다는 뒤에서 앞으로 하나씩 검사(현재 위치의 값과 비교)해서 SWAP해나가는 방식 머릿속에서는 삽입이지만 사실 뒤에서부터 앞방향으로 검사 & SWAP 해서 자리 찾아가는 방식 시간복잡도 For문이 2번 중첩되어 최악의 경우 뒤에서 앞으로 모든 검사를 다하며 찾아가서 선택정렬과 O(n^2)으로 비슷하겠지만 데이터가 정렬이 거의 되어 있는 상태라면 각 idx에 대해서 검사시간이 줄어들어 빠르게 동작한다 import sys input = sys.stdin.readline arr = [4, 2, 6, 1, 9, 23, 45, 21, 28, 19] def insertionSort(a.. 2021. 9. 12.
[Sort] 선택정렬 - Selection Sort 무작위로 데이터들이 있을 때, 가장 작은 수를 맨 앞에 있는 것과 바꾸고 나머지 것들에 대해 또 다시 같은 과정을 반복 가장 작은 것은 맨 앞으로! 시간복잡도 for 문을 두번 돌면서 n개의 위치에 대해 제일 작은 것을 찾기 위해 n, n-1, n-2 ... 1번 탐색을 진행한다. n(n-1)/2로 O(n^2)의 시간복잡도를 가진다 import sys input = sys.stdin.readline INF = int(1e9) arr = [4, 2, 6, 1, 9, 23, 45, 21, 28, 19] def selectSort(arr): for i in range(0, len(arr)-1): min_val = INF min_idx = -1 for j in range(i, len(arr)): if min_v.. 2021. 9. 12.