알고리즘
: 어떠한 문제를 풀어맺기 위해 정해진 일련의 절차나 방법을 공식화한 형태로 표현한 것, 계산을 실행하기 위한 단계적 절차
◾검색
1. 선형검색
datas = [3,2,5,7,9,1,0,8,6,4]
print('datas : {}'.format(datas))
print('datas len : {}'.format(len(datas)))
searchData = int(input('찾으려는 숫자 입력 : '))
searchResultIdx = -1
n = 0
while True :
if n == len(datas):
searchResultIdx = -1
break
elif datas[n] == searchData:
searchResultIdx = n
break
n += 1
print('searchResultIdx : {}'.format(searchResultIdx))
datas = [3,2,5,7,9,1,0,8,6,4]
searchData = int(input('찾으려는 숫자 입력 : '))
searchResultIdx = -1
datas.append(searchData)
n = 0
while True :
if datas[n] == searchData:
if n != len(datas)-1:
searchResultIdx = n
break
n += 1
print('datas : {}'.format(datas))
print('datas len : {}'.format(len(datas)))
print('searchResultIdx : {}'.format(searchResultIdx))
2. 이분검색
이진검색
: 정렬되어있는 자료구조에서 중앙값과의 크고 작음을 이용해 데이터 검색
- 검색대상 2 : 중앙값 5보다 작으므로 왼쪽값에서 재탐색, 값을 찾을 때까지 반복
datas = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
print('datas : {}'.format(datas))
print('datas len : {}'.format(len(datas)))
searchData = int(input('찾으려는 숫자 입력 : '))
searchResultIdx = -1
staIdx = 0
endIdx = len(datas) - 1
midIdx = (staIdx + endIdx) // 2
midVal = datas[midIdx]
print('midIdx : {}'.format(midIdx))
print('midVal : {}'.format(midVal))
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]
print('midIdx : {}'.format(midIdx))
print('midVal : {}'.format(midVal))
elif searchData < midVal:
endIdx = midIdx
midIdx = (staIdx + endIdx) // 2
midVal = datas[midIdx]
print('midIdx : {}'.format(midIdx))
print('midVal : {}'.format(midVal))
elif searchData == midVal:
searchResultIdx = midIdx
break
print('searchResultIdx : {}'.format(searchResultIdx))
◾순위
순위
: 수의 크고 작음을 이용해서 수의 순서를 정하는 것
import random
scores = random.sample(range(50, 101), 20)
ranks = [0 for i in range(20)]
for idx, num1 in enumerate(scores):
for num2 in scores:
if num1 < num2 :
ranks[idx] += 1
print('scores : {}'.format(scores))
print('ranks : {}'.format(ranks))
for idx, num in enumerate(scores):
print('score : {}\trank : {}'.format(num, ranks[idx]+1))
◾기본 정렬
1. 버블 정렬
버블 정렬
: 처음부터 끝까지 인접하는 인덱스의 값을 순차적으로 비교하며 큰 숫자를 가장 끝으로 옮기는 알고리즘
- [10, 2, 7, 21, 0]
- [2,
10
, 7, 21, 0] - [2, 7, 10
, 21, 0] - [2, 7, 10, 21
, 0] - [2, 7, 10, 0, 21
]
- [2,
7
, 10, 0, 21] - [2, 7, 10
, 0, 21] - [2, 7, 0, 10
, 21]
- [2,
7
, 0, 10, 21] - [2, 0, 7
, 10, 21]
- [0,
2
, 7, 10, 21]
nums = [10, 2, 7, 21, 0]
print('not sorted nums : {}'.format(nums))
length = len(nums)
for i in range(length):
for j in range(length - i - 1):
if nums[j] > nums[j+1]:
nums[j], nums[j+1] = nums[j+1], nums[j]
print('sorted nums : {}'.format(nums))
2. 삽입 정렬
삽입 정렬
: 정렬되어 있는 자료 배열과 비교해서 정렬 위치를 찾는다.
- [5, 10, 2, 1, 0]
- [
5
, 10, 2, 1, 0] - [5, 10]
- [
5, 10
, 2, 1, 0] - [2, 5, 10]
- [
2, 5, 10
, 1, 0] - [1, 2, 5, 10]
- [
1, 2, 5, 10
, 0] - [0, 1, 2, 5, 10]
- [0, 1, 2, 5, 10]
nums = [5, 10, 2, 1, 0]
print(nums)
for i1 in range(1, len(nums)):
i2 = i1 - 1
cNum = nums[i1]
while nums[i2] > cNum and i2 >= 0:
nums[i2+1] = nums[i2]
i2 -= 1
nums[i2 + 1] = cNum
print(nums)
3. 선택 정렬
선택 정렬
: 주어진 리스트 중에 최소값을 찾아, 그 값을 맨 앞에 위치한 값과 교체하는 방식으로 자료를 정렬하는 알고리즘
- [4, 2, 5, 1, 3]
- [4, 2, 5,
1
, 3] - [1
, 4, 2, 5, 3]
- [1, 4,
2
, 5, 3] - [1, 2
, 4, 5, 3]
- [1, 2, 4, 5,
3
] - [1, 2, 3
, 4, 5]
- [1, 2, 3,
4
, 5] - [1, 2, 3, 4
, 5]
- [1, 2, 3, 4,
5
] - [1, 2, 3, 4, 5
]
nums = [4, 2, 5, 1, 3]
print('original nums : {}'.format(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
nums[i], nums[minIdx] = nums[minIdx], nums[i]
print('sorted nums : {}'.format(nums))
◾최대값
최대값
: 자료구조에서 가장 큰 값을 찾는다.
nums = [-2, -4, 5, 7, 10, 0, 8, 20, -11]
maxNum = nums[0]
print('nums : {}'.format(nums))
for i in range(1, len(nums)):
if maxNum < nums[i]:
maxNum = nums[i]
print('max : {}'.format(maxNum))
◾최소값
최소값
: 자료구조에서 가장 작은 값을 찾는다.
nums = [-2, -4, 5, 7, 10, 0, 8, 20, -11]
maxNum = nums[0]
print('nums : {}'.format(nums))
for i in range(1, len(nums)):
if maxNum > nums[i]:
maxNum = nums[i]
print('max : {}'.format(maxNum))
◾최빈값
최빈값
: 자료구조에서 빈도수가 가장 많은 데이터
nums = [1, 3, 7, 6, 7, 7, 7, 12, 12, 17]
indexes = [0 for i in range(max(nums) + 1)]
mostNum = 0
count = 0
for num in nums:
indexes[num] += 1
if count < indexes[num]:
mostNum = num
count = indexes[num]
print('mostNum : {}, count : {}'.format(mostNum, count))
◾근사값
import random
nums = random.sample(range(0, 51), 20)
print('nums : {}'.format(nums))
inputNum =int(input('input number : '))
print('inputNum : {}'.format(inputNum))
nearNum = 0
minNum = 50
for n in nums:
absNum = abs(n - inputNum)
if absNum < minNum:
minNum = absNum
nearNum = n
print('nearNum : {}'.format(nearNum))