선형검색 : 선형으로 나열되어 있는 데이터를 순차적으로 스캔하면서 원하는 값을 찾는다
datas # 랜덤한 숫자가 나열된 데이터
searchNum # 찾고자 하는 숫자
searchResultIdx = -1
n = 0
while True:
if n == len(datas):
searchResultIdx = -1
break
elif datas[n] == searchNum:
searchResultIdx = n
break
n += 1
보초법 : 마지막 인덱스에 찾으려는 값을 추가해서 찾는 과정을 간략화한다.
datas # 랜덤한 숫자가 나열된 데이터
searchNum # 찾고자 하는 숫자
searchResultIdx = -1
datas.append(searchNum)
n = 0
while True:
if datas[n] == searchNum:
if n != len(datas) -1 :
searchResultIdx = n
break
n += 1
이진검색 : 정렬되어 있는 자료구조에서 중앙값과의 크고 작음을 이용해서 데이터를 검색한다
datas # 랜덤한 숫자가 나열된 데이터
searchData # 찾고자하는 데이터
searchResultIdx = -1
staIdx = 0 # 처음 인덱스
endIdx = len(datas)-1 # 마지막 인덱스
midIdx = (staIdx+endIdx)//2 # 중간 인덱스
midVal = datas[midIdx]
while searchData <= datas[len(datas)-1] and searchData >= datas[0]:
if searchData == datas[len(datas)-1]:
searchResultIdx = len(datas)-1
break
if searchData > midVal:
staIdx = midIdx
midIdx = (staIdx+endIdx)//2
midVal = datas[midIdx]
elif searchData < midVal:
endIdx = midIdx
midIdx = (staIdx+endIdx)//2
midVal = datas[midIdx]
elif searchData == midVal:
searchResultIdx = midIdx
break
순위 : 수의 크고 작음을 이용해서 수의 순서를 정하는 것을 순위라고 한다.
nums # 랜덤한 숫자가 나열된 데이터
ranks = [0 for i in range(20)] # 길이가 20이고 모든 값이 0인 리스트
for idx, num1 in enumerate(nums):
for num2 in nums:
if num1 < num2:
ranks[idx] += 1
for idx, num in enumerate(nums):
print(f'num : {num}, rank : {ranks[idx]+ 1}')
nums # 랜덤한 숫자가 나열된 데이터
length = len(nums)-1
for i in range(length):
for j in range(length-i):
if nums[j] > nums[j+1]:
temp = nums[j]
nums[j] = nums[j+1]
nums[j+1] = temp
nums # 랜덤한 숫자가 나열된 데이터
for i1 in range(1, len(nums)):
i2 = i1 -1
cNums = nums[i1]
while nums[i2] > cNums and i2 >= 0:
nums[i2 + 1] = nums[i2]
i2 -= 1
nums[i2 +1] = cNums
nums # 랜덤한 숫자가 나열된 데이터
for i in range(len(nums)-1):
minIdx = i
for j in range(i+1 , len(nums)):
if nums[minIdx] > nums[j]:
minIdx = j
temp = nums[i]
nums[i] = nums[minIdx]
nums[minIdx] = temp
numbers # 랜덤한 숫자가 나열된 데이터
maxNum = numbers[0]
for n in numbers:
if maxNum < n:
maxNum = n
numbers # 랜덤한 숫자가 나열된 데이터
minNum = numbers[0]
for n in numbers:
if minNum > n:
minNum = n
nums # 랜덤한 숫자가 나열된 데이터
maxNum = nums[0]
maxNumIdx = 0
for i, n in enumerate(nums):
if maxNum < n:
maxNum = n
maxNumIdx = i
indexes = [0 for i in range(maxNum+1)]
for n in nums:
indexes[n] = indexes[n]+1
nums # 랜덤한 숫자가 나열된 데이터
inputNum # 입력숫자
nearNum = 0
minNum = len(nums)
for n in nums:
absNum = abs(n - inputNum)
if absNum < minNum:
minNum = absNum
nearNum = n
평균
평균 : 여러 수나 양의 중간값을 갖는 수를 평균이라고 한다
재귀
재귀 : 나 자신을 다시 호출하는 것
def recusion(num): # 재귀함수
if num > 0:
print('*'*num)
return recusion(num-1)
else:
return 1
12_2 하노이의 탑 구현하기
# (discCnt : 원판갯수, frombar : 출발기둥, toBar : 도착기둥, VaiBar: 경우기둥)
def moveDisc(discCnt, frombar, toBar, viaBar):
if discCnt == 1:
print(f'{discCnt}disc를 {frombar}에서 {toBar}으로 이동')
else:
moveDisc(discCnt-1 , frombar, viaBar, toBar) # discCnt-1개 원판을 경유기둥으로 옮김
print(f'{discCnt}disc를 {frombar}에서 {toBar}으로 이동') # 제일큰 원판을 도착기둥으로 옮김
moveDisc(discCnt - 1, viaBar, toBar, frombar) # discCnt-1개 원판을 도착기둥으로 옮김
nums # 랜덤한 숫자가 나열된 데이터
def mSort(ns):
if len(ns) < 2:
return ns
midIdx = len(ns) // 2
leftNums = mSort(ns[0:midIdx])
rigthNums = mSort(ns[midIdx:len(ns)])
mergeNums = []
leftIdx = 0; rigthIdx=0
while leftIdx < len(leftNums) and rigthIdx < len(rigthNums):
if leftNums[leftIdx] < rigthNums[rigthIdx]:
mergeNums.append(leftNums[leftIdx])
leftIdx += 1
else:
mergeNums.append(rigthNums[rigthIdx])
rigthIdx += 1
mergeNums = mergeNums + leftNums[leftIdx:]
mergeNums = mergeNums + rigthNums[rigthIdx:]
return mergeNums
nums # 랜덤한 숫자가 나열된 데이터
def qSort(ns, asc = True):
if len(ns) < 2:
return ns
midIdx = len(ns) // 2
midVal = ns[midIdx]
smallNums = []; sameNums=[]; bigNums = []
for n in ns:
if n < midVal:
smallNums.append(n)
elif n == midVal:
sameNums.append(n)
elif n > midVal:
bigNums.append(n)
if asc:
return qSort(smallNums) + sameNums + qSort(bigNums)
else: # 재귀함수 쓸때는 내림차순 리턴 할때도 내림차순 판별 인자 다 넣어주기
return qSort(bigNums,asc = asc)+ sameNums + qSort(smallNums,asc = asc)