: 일렬로 되어 있는 자료를 순서대로 검색하는 방법


def sequential_search(a, n, key): #a: 주어진 배열, n: 배열의 크기, key: 검색할 대상
i = 0
while i < n and a[i] != key:
i += 1
if i < n:
return i
else:
return -1
print(sequential_search([2, 6, 4, 7, 1, 8], 6, 4))


def sequential_search2(a, n, key):
i = 0
while i < n and a[i] != key:
i += 1
if i < n and a[i] == key:
return i
else:
return -1
print(sequential_search2([2, 4, 5, 6, 7, 9], 6, 4))
: 자료의 가운데에 있는 항목의 키 값과 비교하여 다음 검색의 위치를 결정하고 검색을 계속 진행하는 방법
-> 목적 키를 찾을 때까지 이진 검색을 순환적으로 반복 수행함으로써 검색 범위를 반으로 줄여가면서 보다 빠르게 검색을 수행함
!! 이진 검색을 하기 위해서는 자료가 정렬된 상태여야 한다.


def binarySearch(a, N, key): #a: 검색할 배열, N: 배열의 크기, key: 찾으려는 값
start = 0
end = N-1
while start <= end:
middle = (start + end) // 2
if a[middle] == key: #검색 성공
return True
elif a[middle] > key:
end = middle - 1
else:
start = middle + 1
return False #검색 실패
print(binarySearch([2,3,5,6,8,9], 6, 8))
# 재귀 함수 이용 ver.
#a: 검색할 배열, low: 검색할 구간의 첫번째 인덱스, high: 검색할 구간의 마지막 인덱스, key: 찾으려는 값
def binarySerach2(a, low, high, key):
if low > high: #검색 실패
return False
else:
middle = (low + high) // 2
if key == a[middle]: #검색 성공
return True
elif key < a[middle]:
return binarySerach2(a, low, middle-1, key)
elif a[middle] < key:
return binarySerach2(a, middle+1, high, key)
print(binarySerach2([2,4,5,6,8,9], 2, 9, 8))
: 테이블에 대한 동작 속도를 높여주는 자료 구조, 인덱스를 저장하는 데 필요한 디스크 공간은 보통 테이블을 저장하는 데 필요한 디스크 공간보다 작다. 왜냐하면 보통 인덱스는 키-필드만 갖고 있고, 테이블의 다른 세부 항목들은 가지고 있지 않기 때문이다.

: 주어진 자료들 중 가장 작은 값의 원소부터 차례대로 선택하여 위치를 교환하는 방식




def selectionSort(a, N):
for i in range(N-1):
minidx = i
for j in range(i+1, N):
if a[minidx] > a[j]:
minidx = j
a[i], a[minidx] = a[minidx], a[i]
return a
print(selectionSort([4,8,2,6,9,3], 6))
저장되어 있는 자료로부터 k번째로 큰, 혹은 작은 원소를 찾는 방법을 셀렉션 알고리즘이라 한다.
=> 최소값, 최대값 혹은 중간값을 찾는 알고리즘을 의미하기도 한다.
선택 과정
#k번째로 작은 원소를 찾는 알고리즘 > 시간 복잡도 : O(kn)
def select(arr, k):
for i in range(0, k):
minidx = i
for j in range(i+1, len(arr)):
if arr[minidx] > arr[j]:
minidx = j
arr[i], arr[minidx] = arr[minidx], arr[i]
return arr[k-1]
print(select([4,2,7,1,3,8], 3))

T = int(input())
for test_case in range(1, T + 1):
N = int(input())
lst = [list(map(int, input().split())) for _ in range(N)]
lst_90 = [list(t_row[::-1]) for t_row in zip(*lst)]
lst_180 = [list(t_row[::-1]) for t_row in zip(*lst_90)]
lst_270 = [list(t_row[::-1]) for t_row in zip(*lst_180)]
print(f'#{test_case} ')
for i in range(N):
print(*lst_90[i], sep='', end=' ')
print(*lst_180[i], sep='', end=' ')
print(*lst_270[i], sep='', end='')
print()