전체 글
-
이진 탐색 bisect_left, bisect_rightPython/알고리즘 2022. 9. 9. 23:01
이진 탐색 라이브러리 bisect_left(a, x) : 정렬된 순서를 유지하면서 배열 a에 x를 삽입할 가장 왼쪽 인덱스를 반환 bisect_right(a, x) : 정렬된 순서를 유지하면서 배열 a에 x를 삽입할 가장 오른쪽 인덱스를 반환 값이 특정 범위에 속하는 데이터 개수 구하기 from bisect import bisect_left, bisect_right # 값이 [left_value, right_value]인 데이터의 개수를 반환하는 함수 def count_by_range(a, left_value, right_value): right_index = bisect_right(a, right_value) left_index = bisect_left(a, left_value) return right..
-
이진 탐색Python/알고리즘 2022. 9. 9. 22:08
정렬되어 있는 리스트에서 탐색 범위를 절반씩 좁혀가며 데이터를 탐색하는 방법 시간 복잡도는 O(logN) 답안 예시 # 이진 탐색 소스코드 구현 (재귀 함수) def binary_search(array, target, start, end): if start > end: return None mid = (start + end) // 2 # 찾은 경우 중간점 인덱스 반환 if array[mid] == target: return mid # 중간점의 값보다 찾고자 하는 값이 작은 경우 왼쪽 확인 elif array[mid] > target: return binary_search(array, target, start, mid-1) # 중간점의 값보다 찾고자 하는 값이 큰 경우 오른쪽 확인 else: return ..
-
정렬 알고리즘 기초 문제풀이 < 두 배열의 원소 교체 >Python/알고리즘 2022. 9. 9. 18:23
문제 설명, 조건 ● 동빈이는 두 개의 배열 A와 B를 가지고 있습니다. 두 배열은 N개의 원소로 구성되어 있으며, 배열의 원소는 모두 자연수입니다. ● 동빈이는 최대 K 번의 바꿔치기 연산을 수행할 수 있는데, 바꿔치기 연산이란 배열 A에 있는 원소 하나와 배열 B에 있는 원소 하나를 골라서 두 원소를 서로 바꾸는 것을 말합니다. ● 동빈이의 최종 목표는 배열 A의 모든 원소의 합이 최대가 되도록 하는 것이다. ● N, K 그리고 배열 A와 B의 정보가 주어졌을 때, 최대 K 번의 바꿔치기 연산을 수행하여 만들 수 있는 배열 A의 모든 원소의 합의 최댓값을 출력하는 프로그램을 작성하세요. ● 예를 들어 N = 5, K = 3이고, 배열 A와 B가 다음과 같다고 해봅시다. 배열 A = [1, 2, 5, ..
-
정렬 알고리즘 - 계수 정렬Python/알고리즘 2022. 9. 8. 02:19
특정한 조건이 부합할 때만 사용할 수 있지만 매우 빠르게 동작하는 정렬 알고리즘 데이터의 크기 범위가 제한되어 정수 형태로 표현할 수 있을 때 사용 시간 복잡도는 O(N+K) 답안 예시 # 모든 원소의 값이 0보다 크거나 같다고 가정 array = [7, 5, 9, 0, 3, 1, 6, 2, 9, 1, 4, 8, 0, 5, 2] #모든 범위를 포함하는 리스트 선언(모든 값인 0으로 초기화) count = [0] * (max(array) + 1) for i in range(len(array)): count[array[i]] += 1 # 각 데이터에 해당하는 인덱스의 값 증가 for i in range(len(count)): # 리스트에 기록된 정렬 정보 확인 for j in range(count[i]): ..
-
정렬 알고리즘 - 퀵 정렬Python/알고리즘 2022. 9. 8. 01:31
기준 데이터를 설정하고 그 기준보다 큰 데이터와 작은 데이터의 위츠를 바꾸는 방법 시간 복잡도는 O(NlogN)이며 최악의 경우 O(N^2) 답안 예시 array = [5, 7, 9, 0, 3, 1, 6, 2, 4, 8] def quick_sort(array, start, end): if start >= end: # 원소가 1개인 경우 종료 return pivot = start # 피벗은 첫 번째 원소 left = start + 1 right = end while (left right): # 엇갈렸다면 작은 데이터와 피벗을 교체 array[right], array[pivot] = array[pivot], array[right] else: # 엇갈리지 않았다면 작은 데이터와 큰 데이터를 교체 array[l..
-
정렬 알고리즘 - 삽입 정렬Python/알고리즘 2022. 9. 6. 21:43
처리되지 않은 데이터를 하나씩 골라 적절한 위치에 삽입합니다. 시간 복잡도는 O(N^2)이며 최선의 경우 O(N) 답안 예시 array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8] for i in range(1, len(array)): for j in range(i, 0, -1) # 인덱스 i부터 1까지 1씩 감소하며 반복하는 문법 if array[j] < array[j-1]: # 한 칸씩 왼쪽으로 이동 array[j], array[j-1] = array[j-1], array[j] else: # 자기보다 작은 데이터를 만나면 그 위치에서 멈춤 break print(array) 작성한 답안 numList = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8] for i in range(1..
-
정렬 알고리즘 - 선택 정렬Python/알고리즘 2022. 9. 6. 21:07
처리되지 않은 데이터 중에서 가장 작은 데이터를 선택해 맨 앞에 있는 데이터와 바꿈 시간 복잡도는 O(N^2) 답안 예시 array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8] for i in range(len(array)): min_index = i # 가장 작은 원소의 인덱스 for j in range(i+1, len(array)): if array[min_index] > array[j]: min_index = j array[i], array[min_index] = array[min_index], array[i] # 스와프 print(array) 작성한 답안 numList = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8] result = [] min = 0 # 오름차순으로 정렬..
-
DFS & BFS 기초 문제풀이 < 미로 탈출 >Python/알고리즘 2022. 8. 30. 21:27
문제 설명, 조건 ● 동빈이는 N x M 크기의 직사각형 형태의 미로에 갇혔습니다. 미로에는 여러 마리의 괴물이 있어 이를 피해 탈출해야 합니다. ● 동빈이의 위치는 (1, 1)이며 미로의 출구는 (N, M)의 위치에 존재하며 한 번에 한 칸씩 이동할 수 있습니다. 이때 괴물이 있는 부분은 0으로, 괴물이 없는 부분은 1로 표시되어 있습니다. 미로는 반드시 탈출할 수 있는 형태로 제시됩니다. ● 이때 동빈이가 탈출하기 위해 움직여야 하는 최소 칸의 개수를 구하세요. 칸을 셀 때는 시작 칸과 마지막 칸을 모두 포함해서 계산합니다. ● 입력 조건 첫째 줄에 두 정수 N, M(4 = m: continue # 벽인 경우 무시 if graph[nx][ny] == 0: continue # 해당 노드를 처음 방문하는..