본문 바로가기

분류 전체보기

(53)
파이썬 검색 (bisect, dict, set) bisect_left, bisect_right : 이진 탐색을 기반으로 한 함수정렬된 리스트에서 특정 값의 위치를 찾거나, 그 값을 삽입할 위치를 알려주는 함수 from bisect import bisect_left, bisect_right #import 해준다x = [2, 3, 5, 5, 7, 9, 9, 9]#right에서 left의 값을 빼주면 7이라는 값은 하나가 있다는것을 알 수 있다print(bisect_left(x, 7, 0, len(x))) #4 출력print(bisect_right(x, 7, 0, len(x))) #5 출력#right에서 left의 값을 빼주면 5이라는 값은 두개가 있다는것을 알 수 있다print(bisect_left(x, 5, 0, len(x))) #2print(b..
Map ADT에서 검색을 구현하는 방법 (2) | RBT, Hashing 레드-블랙 트리(RBT : red-black tree)BST의 최악의 형태가 나오지 않도록 균형잡힌 이진트리일반 BST는 삽입하는 순서에 따라 성능이 퀵 정렬처럼 불안정할 수 있음.RBT는 삽입/삭제 시 스스로 균형을 유지하면서 성능을 보장해줌.그래서 시간 복잡도 최악을 방지하는 구조라고 보면 됨.삽입 규칙1. 레드 링크는 항상 왼쪽이어야 한다👉 오른쪽에 있으면 왼쪽으로 회전(Left Rotate) 해야 함.이유는: 일관된 구조를 유지하기 위해 (left-leaning 구조).2. 연속된 레드 링크(두 개 연속으로)는 안 된다👉 예: 왼쪽에 레드가 두 개 있는 경우는 오른쪽 회전(Right Rotate).회전 후, 색 반전(3번)까지 함께 진행함.3. 부모가 검정, 자식 둘 다 레드일 경우👉 색 반..
Map ADT에서 검색을 구현하는 방법 (1) | BST "키(Key)를 이용해서 값을(Value) 빠르게 찾는 데이터 구조" “BST, 해시테이블 등은 Set이나 Map을 구현할 때 쓰인다.”Stack, Queue 같은 건 대부분 배열이나 연결리스트로 구현. 이제 검색을 구현하는 알고리즘을 알아보자1. 이분 탐색/검색 (Binary Search): 정렬된 배열이나 리스트에서 값을 빠르게 찾을 수 있는 알고리즘.def binarySearch(arr, x, low, high): #arr 리스트에서 x 값 검색 mid = (low + high) // 2 if low > high: print("없습니다") # 찾는 값이 없을 때 return -1 if x == arr[mid]: print(mid,"인덱스에 있습..
파이썬의 시스템 정렬 1. 파이썬 기본 정렬: sorted() vs .sort()2. key 매개변수로 정렬 기준 지정하기words = ['apple', 'banana', 'kiwi', 'mango']# 길이 기준 정렬 (오름차순)sorted(words, key=len) # ['kiwi', 'mango', 'apple', 'banana']# 길이 기준 정렬 (내림차순 / reverse=True)sorted(words, reverse=True, key=len) # ['banana', 'apple', 'mango' ,'kiwi'] 3. 2차원 배열(리스트) 정렬 students = [ ["Charlie", 85], ["Alice", 85], ["Bob", 95]]# 점수 기준 오름차순 정렬students.so..
Kadane's 알고리즘 (MCSS Maximum Contiguous Subsequence Sum) 주어진 배열에서 연속된 부분 구간의 합 중 최댓값을 구하는 문제 MCSS(Maximum Contiguous Subsequence Sum)arr = [1, 2, 3, 4]max_sum = arr[0] # 전체 중 최댓값 저장current_sum = arr[0] # 현재 구간의 누적합for i in range(1, len(arr)): if current_sum + arr[i] > arr[i]: current_sum += arr[i] # 누적합 유지 else: current_sum = arr[i] # 새 구간 시작 if current_sum > max_sum: max_sum = current_sum # 최댓값 갱신print..
특수 정렬 (기수 정렬, 계수 정렬) 기수정렬(radix sort) : 각 자릿수를 기준으로 정렬숫자나 문자열의 자릿수를 기준으로 데이터를 정렬자릿수의 개수가 같은 경우 유용ex) 계좌번호, 날짜, 주민등록번호, 인터넷 주소, 전화번호오른쪽에서 왼쪽으로 기수(radix, base)별로 안정성을 유지하면 정렬 계수 정렬(counting sort) : 숫자의 크기를 비교하지 않고, 각 숫자가 몇 번 나오는지를 세서 정렬하는 방법과정 1 : array의 각 값을 인덱스로 하는 counting배열의 값을 1씩 증가시킨다 0은 1번1은 2번2는 1번..7은 3번 과정 2 : counting의 배열의 값을 누적합으로 변환시킨다 과정 3 array의 오른쪽부터 탐색한다counting 배열은 "해당 값 이하의 원소가 몇 개인가"를 알려준다원소를 resul..
계산복잡도 vs 시간복잡도 계산복잡도는:→ “문제 자체가 풀리는 데 필요한 최소 시간”→ 이건 문제 전체의 하한선시간복잡도에서의 최선은:→ “어떤 알고리즘이 특별히 좋은 경우에 걸리는 시간”→ 이건 특정 알고리즘의 최선의 경우즉,계산복잡도는 “문제 입장”에서의 최선시간복잡도는 “알고리즘 입장”에서의 성능 (평균, 최악, 최선) ✈️ 비행기를 타고 서울 → 부산 간다고 하자계산복잡도:✨ "서울에서 부산까지 갈 수 있는 가장 빠른 수단으로 걸리는 최소 시간"→ 비행기 타면 1시간. 이게 계산복잡도.시간복잡도의 최선:🚗 어떤 사람이 차를 타고 갔는데평소엔 5시간 걸리지만오늘은 도로가 뻥 뚫려서 3시간 걸림→ 이게 특정 알고리즘(=차) 의 최선 시간🚨 즉, 비행기(=최고 알고리즘)가 있을 수 있는데,자동차(=다른 알고리즘) 가 최선일..
분할 알고리즘과 퀵정렬 퀵정렬(Quick sorting) 알고리즘 분할 알고리즘으로 분할된 부분 배열을 재귀적으로 정렬하는 알고리즘 분할(partition) 알고리즘분할 원소(partition element 혹은 pivot item)보다 작은 원소는 왼쪽 배열로, 큰 원소는 오른쪽 배열로 분할하는 알고리즘def partition(a, low, high): pivot = a[low] # 배열의 첫 요소를 pivot으로 설정 i = low + 1 # 왼쪽 포인터는 pivot 다음 위치에서 시작 j = high # 오른쪽 포인터는 배열의 끝에서 시작 while 1: while i = low + 1 and a[j] > p..