정렬

    힙 정렬(heap sort)

    힙 정렬(heap sort)

    📔 힙 정렬(heap sort) 이란 힙트리구조를 이용하여 정렬하는 알고리즘 힙트리: 최솟값이나 최댓값을 빠르게 찾아내기 위해 완전 이진 트리를 기반으로 하는 트리 힙정렬을 하기 위해서는 먼저 힙 구조를 가지도록 만들어야 한다. 히피파이 알고리즘을 통해 힙구조로 만든다. 모든 정점에 대해서 히피파이를 수행하므로 n x logn 의 시간복잡도를 가진다. 사실상 모든 정점이 아니라 절반의 정점만 해도 가능하다 n/2 x logn => (n/2이 logn 보다 크다고 가정할 때) => 결국 O(n) 의 시간복잡도를 가진다. 📔 힙 정렬(heap sort) 구현 # (최대)힙 구조 만들기 def heapify(): for i in range(1, N): c = i while c > 0: root = (c - 1..

    [python] 백준 - 1931. 회의실 배정

    [python] 백준 - 1931. 회의실 배정

    🤔문제 해결 S2 | 정렬, 그리디 회의 시간이 긴 것과 상관 없이 회의가 끝나는 시각이 빠른것을 선택 회의가 끝나는 시각이 빠른 순으로 정렬 이전 회의가 끝난 시각과 비교하여 회의를 시작할 수 있으면 카운트 +1 없으면 통과 💨 끝나는 시각 뿐만 아니라 시작 시간도 두번 째로 정렬 해줘야 한다. 반례 [2,2], [1,2] 💨 sys.stdin.readline 과 input의 차이 (아래가 input()으로 받은 것) 💻소스 코드 import sys input = sys.stdin.readline N = int(input()) meetings = [list(map(int, input().split())) for _ in range(N)] meetings.sort(key=lambda x: (x[1], x..

    계수 정렬(counting sort)

    계수 정렬(counting sort)

    📔 계수 정렬(counting sort) 이란 작은 범위 조건이 있는 경우에 한해서 빠른 알고리즘 시간복잡도: O(N), 최악의 경우 O(N^2) 크기를 기준으로 갯수만 세주면 된다. 비교정렬 X 📔 계수 정렬(counting sort) 구현 N = 5 # 5 이하인 수들을 정렬해라 numbers = [1, 2, 3, 4, 5, 1, 1, 2, 3, 4, 5, 3, 3, 2, 1, 2, 3, 1, 2, 3, 4, 1, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5] print(f'정렬 전: {numbers}') count_list = [0] * (N + 1) for number in numbers: count_li..

    병합 정렬(merge sort)

    병합 정렬(merge sort)

    📔 병합 정렬(merge sort) 이란 분할정복을 활용하여 구현하기 때문에 시간복잡도는 O(nlogn) 퀵정렬과 비슷 분할정복: 문제를 작은 2개의 문제로 분리하고 각각 해결한 후, 다시 모아 원래의 문제를 해결하는 방법. 보통 재귀함수 호출을 이용하여 구한다. 퀵정렬과 다른 점이 있다면 퀵정렬의 경우 pivot값에 따라 편향되게 분할 될 수 있는 가능성이 있기 때문에 최악의 경우 O(n^2)의 시간복잡도를 가진다. 그러나 병합정렬의 경우 정확히 반씩 나눈다는 점에서 최악의 경우에도 O(nlogn)의 시간복잡도를 보장한다. 만약 8개의 숫자를 정렬한다고 하자. 8에서 4로 나누고, 4에서 2로 나누고, 2에서 1로 나눈다. 즉 3번 나눴다. 그러므로 나누는 것은 3 = log8 이므로 logn이다. 나..

    퀵 정렬(quick sort)

    퀵 정렬(quick sort)

    📔 퀵 정렬(quick sort) 이란 분할정복을 활용하여 구현하기 때문에 시간복잡도는 O(nlogn) 퀵이란 이름에 맞게 빠르다. 분할정복: 문제를 작은 2개의 문제로 분리하고 각각 해결한 후, 다시 모아 원래의 문제를 해결하는 방법. 보통 재귀함수 호출을 이용하여 구한다. 기준 값(pivot)을 기준으로 그 값보다 큰 값과 작은 값을 서로 교환한 뒤 기준 값을 기준으로 두개의 리스트로 나눈다. (기준 값의 왼쪽에는 작은 값, 오른쪽에는 큰 값) 대부분의 경우에는 퀵정렬이 가장 빠르다. (c언어의 정렬 알고리즘도 퀵정렬 기반) 비교 정렬 ( 다른 원소와의 비교 ) 📔 퀵 정렬(quick sort) 예제 맨앞의 값 3을 pivot 값으로 설정했다 ( 보통 가장 앞의 값을 pivot으로 설정) pivot값..

    삽입 정렬(insertion sort)

    삽입 정렬(insertion sort)

    📔 삽입 정렬(insertion sort) 이란 숫자를 적절한 위치에 삽입하는 방법 "필요할 경우에만" 위치를 바꾼다. 2개의 반복문을 중첩해서 구현하기 때문에 시간복잡도는 O(n^2) 한 세트가 끝날 때마다 앞의 숫자들은 "정렬"된 상태이다. 📔 삽입 정렬(insertion sort) 예제 위의 예제는 오름차순일 경우의 예제이다. 5개의 원소중 처음과 그 다음을 비교한다. 그 둘을 정렬한다. 1세트가 끝나면 앞의 숫자들(노란색)은 정렬된 상태이다. 다음 세트는 두번째 숫자부터 앞의 숫자와 비교한다. 📔 삽입 정렬(insertion sort) 구현 numbers = [5, 3, 8, 1, 2] print(f'정렬 전: {numbers}') print() for i in range(len(numbers)-..