Q. 정렬 알고리즘에 대해 설명해주세요.
글 작성자: 택시 운전사
반응형
Q. 정렬 알고리즘에 대해 설명해주세요.
Goal
- 정렬 알고리즘의 개념을 설명할 수 있다.
- 정렬 알고리즘의 종류에 대해 설명할 수 있다.
정렬 알고리즘의 개념
정렬 알고리즘이란
- 데이터들이 주어졌을 때 이를 정해진 순서대로 나열하는 것
- 얼마나 효과적으로 해결하는 지가 정렬 알고리즘의 핵심
정렬 알고리즘이 중요한 이유
- 데이터가 정렬되어 있으면 이진탐색이라는 강력한 알고리즘을 사용할 수 있다.
대표적인 정렬의 종류
- 실제 응용에서는 상황에 따라 두 가지 이상의 정렬 방법을 사용하는 경우가 많다.
- 정렬 대상이 특정 크기 이하로 단편화될 때까지는 퀵 정렬을 쓰다가, 삽입정렬을 쓴다던가, 특정 횟수 이상 재귀호출이 발생하면 O(nlgn)의
힙 정렬
을 사용한다.
버블정렬(Bubble Sort)
방법
1번째와 2 번째 원소를 비교하여 정렬하고, 2번째와 3번째, ... , n-1번째와 n번째를 비교하여 정렬한 뒤 다시 처음으로 돌아가 이번에는 n-2번째 와 n-1번째까지해서 총 n(n-1)/2 번 정렬한다.
시간복잡도
- 가장 쉬운 정렬 알고리즘이지만, 거의 모든 상황에서 최악의 성능을 보여준다
예시
def BubbleSort(li): len_list = len(li) # 두 개씩 비교하기 때문에 범위는 `range(len_list-1)`이 되어야 한다. for i in range(len_list-1): # 안 쪽의 `for loop`는 실제 비교를 하는 부분에 해당한다. # 따라서 범위는 `range(len_list-i-1)이 되어야 한다. # 1번째와 2 번째 원소를 비교하여 정렬하고, 2번째와 3번째, ... , n-i-1번째와 n-i번째를 비교하여 정렬한다. for j in range(len_list-i-1): if li[j] > li[j+1]: li[j], li[j+1] = li[j+1], li[j] return li
선택정렬(Selection Sort)
방법
1번째부터 끝까지 훑어서 가장 작은 것을 찾아서 1번째에, 2번째부터 끝까지 훑어서 가장 작은 것을 찾아서 2번째에 ... (n-1)번을 반복한다.
- 주어진 리스트 중에 최솟값을 찾는다.
- 그 값을 맨 앞에 위치한 값과 교체한다.
- 맨 처음 위치를 뺀 나머지 리스트를 같은 방법으로 교체한다.
시간복잡도
예시
def selection_sort(li): for i in range(len(li)-1): min_idx = i for j in range(i+1, len(li)): if li[min_idx] > li[j]: min_idx = j if min_idx != i: li[i], li[min_idx] = li[min_idx], li[i] return li
삽입정렬(Insertion Sort)
방법
1부터 n까지 Index를 설정하여 현재 위치보다 아래쪽을 순회하며 현재 위치의 값을 현재 위치보다 아래쪽으로 순회하며 알맞은 위치에 넣어주는 알고리즘이다.
시간복잡도
예시
def insertion_sort(li): for i in range(1, len(li)): j = i - 1 key = li[i] while li[j] > key and j >= 0: li[j+1] = li[j] j -= 1 li[j+1] = key return li
병합정렬(Merge Sort)
방법
리스트를 반으로 쪼개나가며 좌측과 우측 리스트를 계속 하여 분할해 나간 후 각 리스트 내에서 정렬 후 병합 정렬 후 병합하는 과정을 통해 정렬하는 알고리즘
시간복잡도
- 가장 많이 쓰이는 정렬 알고리즘 중 하나
예시
퀵정렬(Quick Sort)
방법
pivot
을 선정하여 pivot
을 기준으로 좌측과 우측으로 pivot
보다 작은 값은 왼쪽에 pivot
보다 큰 값은 오른쪽으로 재배치하고 계속하여 분할하여 정렬하는 알고리즘
시간복잡도
- 최악의 경우 ( pivot이 최대 혹은 최소인 경우 )
- 일반적인 경우
- 이름 그대로 real-world 데이터에서 빠르다고 알려져 있어 가장 많이 쓰는 정렬 알고리즘
- pivot은 랜덤으로 잡거나, 3개나 9개 원소를 골라서 중앙값을 선택한다.
예시
반응형
'Algorithm > Problem Solving' 카테고리의 다른 글
[BOJ] 👸 N-Queens / 파이썬 (3) | 2019.02.01 |
---|---|
[프로그래머스] 🚍 셔틀버스 - [1차] 2018 카카오 블라인드 채용 / Python / KAKAO BLIND RECRUITMENT (0) | 2019.02.01 |
[프로그래머스] 이상한 문자 만들기 / 파이썬 (0) | 2019.01.31 |
[프로그래머스] 👨🎓 N으로 표현 / 파이썬 (0) | 2019.01.31 |
[프로그래머스] 🔐 시저 암호 / 파이썬 (0) | 2019.01.31 |
댓글
이 글 공유하기
다른 글
-
[프로그래머스] 🚍 셔틀버스 - [1차] 2018 카카오 블라인드 채용 / Python / KAKAO BLIND RECRUITMENT
[프로그래머스] 🚍 셔틀버스 - [1차] 2018 카카오 블라인드 채용 / Python / KAKAO BLIND RECRUITMENT
2019.02.01🚍 셔틀버스 - [1차] 2018 카카오 블라인드 채용 / Python / KAKAO BLIND RECRUITMENT 문제 설명 카카오에서는 무료 셔틀버스를 운행하기 때문에 판교역에서 편하게 사무실로 올 수 있다. 카카오의 직원은 서로를 '크루'라고 부르는데, 아침마다 많은 크루들이 이 셔틀을 이용하여 출근한다. 이 문제에서는 편의를 위해 셔틀은 다음과 같은 규칙으로 운행한다고 가정하자. 셔틀은 09:00부터 총 n회 t분 간격으로 역에 도착하며, 하나의 셔틀에는 최대 m명의 승객이 탈 수 있다. 셔틀은 도착했을 때 도착한 순간에 대기열에 선 크루까지 포함해서 대기 순서대로 태우고 바로 출발한다. 예를 들어 09:00에 도착한 셔틀은 자리가 있다면 09:00에 줄을 선 크루도 탈 수 있다. 일찍 나와서 … -
[프로그래머스] 이상한 문자 만들기 / 파이썬
[프로그래머스] 이상한 문자 만들기 / 파이썬
2019.01.31🤔 이상한 문자 만들기 문제 설명 문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요. 제한 사항 문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다. 😃 나의 풀이 def solution(s): answer = '' lst = s.split(' ') for idx, string in enumerate(lst): for i in range(len(string)): if i%2 == 0: string = string[:i] + string[i].upper(… -
[프로그래머스] 👨🎓 N으로 표현 / 파이썬
[프로그래머스] 👨🎓 N으로 표현 / 파이썬
2019.01.31N으로 표현 문제 설명 아래와 같이 5와 사칙연산만으로 12를 표현할 수 있습니다. 12 = 5 + 5 + (5 / 5) + (5 / 5) 12 = 55 / 5 + 5 / 5 12 = (55 + 5) / 5 5를 사용한 횟수는 각각 6,5,4 입니다. 그리고 이중 가장 작은 경우는 4입니다. 이처럼 숫자 N과 number가 주어질 때, N과 사칙연산만 사용해서 표현 할 수 있는 방법 중 N 사용횟수의 최솟값을 return 하도록 solution 함수를 작성하세요. 제한사항 N은 1 이상 9 이하입니다. number는 1 이상 32,000 이하입니다. 수식에는 괄호와 사칙연산만 가능하며 나누기 연산에서 나머지는 무시합니다. 최솟값이 8보다 크면 -1을 return 합니다. 😃 나의 풀이 dic = {0:1… -
[프로그래머스] 🔐 시저 암호 / 파이썬
[프로그래머스] 🔐 시저 암호 / 파이썬
2019.01.31🔐 시저 암호어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 AB는 1만큼 밀면 BC가 되고, 3만큼 밀면 DE가 됩니다. z는 1만큼 밀면 a가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.제한 조건공백은 아무리 밀어도 공백입니다.s는 알파벳 소문자, 대문자, 공백으로만 이루어져 있습니다.s의 길이는 8000이하입니다.n은 1 이상, 25이하인 자연수입니다.😃 나의 풀이 1 2 3 4 5 6 7 8 9 10 11 12 13 def solution(s, n): upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' lower = upper.lower() f…
댓글을 사용할 수 없습니다.