학습범위: 알고리즘
선형 검색, 이진 검색, 순위, 버블 정렬, 삽입 정렬, 선택 정렬, 최댓값, 최솟값, 최빈값, 근삿값, 평균, 재귀, 하노이의 탑, 병합 정렬, 퀵 정렬
선형으로 나열되어 있는 데이터를 순차적으로 스캔하면서 원하는 값을 찾는다.
마지막 인덱스에 찾으려는 값을 추가해서 찾는 과정을 간략화한다.
nums = [4, 7, 10, 2, 4, 7, 0, 2, 7, 3, 9]
#print(f'nums: {nums}')
#print(f'length: {len(nums)}')
searchData = int(input('search number: '))
searchResultIdx = -77
# 보초법 사용
nums.append(searchData)
n = 0
while True:
if nums[n] == searchData:
if n != len(nums) - 1:
#보초법으로 맨 마지막에 추가한 데이터(searchData)가 아니어야 함
#인덱스 순번n은 0부터 시작하므로 전체 길이에서도 -1을 해줘야 같은 위치임
searchResultIdx = n
break
n += 1
print(f'nums: {nums}')
print(f'length: {len(nums)}')
if searchResultIdx == -77:
print('not search index')
else:
print(f'search index: {searchResultIdx}')
search number: 7
nums: [4, 7, 10, 2, 4, 7, 0, 2, 7, 3, 9, 7]
length: 12
search index: 1
search number: 11
nums: [4, 7, 10, 2, 4, 7, 0, 2, 7, 3, 9, 11]
length: 12
not search index
nums = [4, 7, 10, 2, 4, 7, 0, 2, 7, 3, 9]
searchData = int(input('search number: '))
searchResultIdx = []
# 보초법 사용
nums.append(searchData)
n = 0
while True:
if nums[n] == searchData:
if n != len(nums) - 1:
searchResultIdx.append(n)
else:
break
n += 1
print(f'nums: {nums}')
print(f'searchResultIdx: {searchResultIdx}')
print(f'cnt: {len(searchResultIdx)}')
search number: 7
nums: [4, 7, 10, 2, 4, 7, 0, 2, 7, 3, 9, 7]
searchResultIdx: [1, 5, 8]
cnt: 3
search number: 11
nums: [4, 7, 10, 2, 4, 7, 0, 2, 7, 3, 9, 11]
searchResultIdx: []
cnt: 0
정렬되어 있는 자료구조에서 중앙값과의 크고 작음을 이용해서 데이터를 검색한다.
nums = [4, 10, 22, 5, 0, 17, 7, 11, 9, 61, 88]
nums.sort()
print(f'nums: {nums}')
searchData = int(input('search number: '))
searchIdx = -77
startIdx = 0
endIdx = len(nums) - 1
midIdx = (startIdx + endIdx) //2
midVal = nums[midIdx]
while searchData <= nums[len(nums) - 1] and searchData >= nums[0]:
if searchData == nums[len(nums) - 1]:
searchData = len(nums) - 1
break
if searchData > midVal:
startIdx = midIdx
midIdx = (startIdx + endIdx) // 2
midVal = nums[midIdx]
elif searchData < midVal:
endIdx = midIdx
midIdx = (startIdx + endIdx) // 2
midVal = nums[midIdx]
elif searchData == midVal:
searchIdx = midIdx
break
print(f'searchIdx: {searchIdx}')
nums: [0, 4, 5, 7, 9, 10, 11, 17, 22, 61, 88]
search number: 7
searchIdx: 3
nums: [0, 4, 5, 7, 9, 10, 11, 17, 22, 61, 88]
search number: 100
searchIdx: -77
수의 크고 작음을 이용해서 수의 순서를 정하는 것을 순위라고 한다.
import random
scores = random.sample(range(80, 101), 7)
ranks = [0 for i in range(7)]
for idx, sco1 in enumerate(scores):
for sco2 in scores:
if sco1 < sco2:
ranks[idx] += 1
print(scores)
print(ranks)
for i, s in enumerate(scores):
print(f'score:{s} \t rank:{ranks[i] + 1}')
[97, 85, 93, 95, 86, 98, 94]
[1, 6, 4, 2, 5, 0, 3]
score:97 rank:2
score:85 rank:7
score:93 rank:5
score:95 rank:3
score:86 rank:6
score:98 rank:1
score:94 rank:4