[최댓값]
- 자료구조에서 가장 큰 값을 찾는다.
- 자료의 0번째 인덱스 값을 max라 두고, for문을 돌려 값을 비교해가며 실제 max를 찾습니다.
class MaxAlgo:
def __init__(self,datas):
self.datas = datas
self.max_value = 0
def get_max_value(self):
self.max_value = self.datas[0]
for i in self.datas:
if self.max_value < i :
self.max_value = i
return self.max_value
mylist = [11, 8, 76, 75, 10, 72, 68, 93, 35, 41, 64, 42, 30, 29, 65, 48, 56, 76, 29, 66]
maxalgo = MaxAlgo(mylist)
print(maxalgo.get_max_value())
# 93
[최솟값]
- 자료구조에서 가장 작은 값을 찾는다.
- 최댓값 알고리즘과 원리가 같습니다.
class MinAlgo:
def __init__(self,datas):
self.datas = datas
self.min_value = 0
def get_min_value(self):
self.min_value = self.datas[0]
for i in self.datas:
if self.min_value > i :
self.min_value = i
return self.min_value
mylist = [5, 2, 4, 1, 3]
algo = MinAlgo(mylist)
print(algo.get_min_value())
# 1
[최빈값]
- .빈도수가 가장 높은 데이터를 찾는다. ( \(O(N)\) )
- 먼저 데이터셋에서 가장 큰 값의 value와 index를 찾는 함수를 만든 후
- 가장 큰 값의 value를 가장 큰 인덱스로 가지는 index 리스트를 만든다. ( 만약 최댓값이 2라면, 리스트는 [0,0,0] )
- for 문을 한번 돌려, 각 요소 값에 해당하는 index 리스트의 값들에 +1 씩 해준다.
- index 리스트에서 최댓값을 찾아 반환한다.
class MaxAlgo :
def __init__(self,datas):
self.datas = datas
self.max_value = 0
self.max_idx = 0
def set_max_idx_value(self):
self.max_value = self.datas[0]
self.max_idx = 0
for i in range(len(self.datas)):
if self.datas[i] > self.max_value:
self.max_value = self.datas[i]
self.max_idx = i
def get_max_idx(self):
return self.max_idx
def get_max_value(self):
return self.max_value
datas = [1,3,7,6,7,7,7,12,12,17]
maxalgo1 = MaxAlgo(datas)
maxalgo1.set_max_idx_value()
print(f'max_value : {maxalgo1.get_max_value()}')
print(f'max_idx : {maxalgo1.get_max_idx()}')
indexes = [0 for _ in range(maxalgo1.get_max_value()+1)] # 인덱스 리스트를 만든다.
for i in datas:
indexes[i] += 1 # 데이터의 각 요소에 해당하는 인덱스에 각 요소를 만날때마다 1 씩 더해준다.
maxalgo2 = MaxAlgo(indexes)
maxalgo2.set_max_idx_value() # 인덱스 리스트에서 최대값이 곧 최빈값
print(f'최빈값은 : {maxalgo2.get_max_idx()}')
[근삿값]
- 특정 값(참값)에 가장 가까운 값을 근사값 이라고 한다.
- 가장 작은 차이의 값을 찾아내어 출력하면 되겠다. ( 최솟값 구하는 알고리즘과 같다. )
import random
def apporxi(datas,input_num):
nearnum = datas[0]
for i in range(len(datas)):
if abs(input_num-nearnum) > abs(input_num-datas[i]):
nearnum = datas[i]
return nearnum
numbers = random.sample(range(0,50),20) # 중복 없이 20개의 수를 뽑는다.
print(numbers)
print(f'근사값은 {apporxi(numbers,30)}이다.')
[평균]
- 여러 수나 양의 중간 값을 갖는 수를 평균이라고 한다.
import random
def mean(datas):
total = 0
for i in datas:
total += i
return total/len(datas)
nums = random.sample(range(0,101),10)
print(f'nums : {nums}')
print(f'mean : {mean(nums)}')
[실습1] 아스키 코드 값이 가장 큰 값을 찾는 알고리즘을 만들어보자.
class MaxAlgo :
def __init__(self, datas):
self.datas = datas
self.max_chr = 0
def get_max_char(self):
self.max_chr = self.datas[0]
for i in self.datas:
if ord(self.max_chr) < ord(i):
self.max_chr = i
return self.max_chr
datas = ['c','A','Q','q','e','F','p']
algo = MaxAlgo(datas)
print(algo.get_max_char())
#q
[실습2] 학생 100명의 점수 분포를 나타내보자.
import random
scorelist = [random.choice(range(80,101)) for _ in range(100)]
print(scorelist)
index_list = [0 for _ in range(21)]
for i in scorelist:
index_list[i-80] += 1
for idx,item in enumerate(index_list):
print('{}점의 빈도 수 :\t{}\t{}'.format(idx+80,index_list[idx],'+'*(index_list[idx])))
'''
[97, 97, 81, 95, 85, 94, 91, 90, 82, 86, 81, 91, 88, 84, 100, 92, 93, 92, 84, 100, 86, 94, 93, 96, 92,
88, 88, 93, 93, 85, 100, 84, 87, 89, 81, 89, 97, 91, 90, 81, 99, 88, 98, 84, 83, 82, 90, 84, 92, 81, 84, 93, 85, 83, 96, 90, 100, 80, 99, 92, 88, 82, 83, 97, 89, 87, 100, 91, 83, 89, 81, 100, 90, 90, 87, 88, 99, 84, 87, 99, 84, 97, 95, 92, 94, 95, 82, 93, 92, 84, 89, 82, 85, 85, 80, 96, 87, 84, 94, 99]
80점의 빈도 수 : 2 ++
81점의 빈도 수 : 6 ++++++
82점의 빈도 수 : 5 +++++
83점의 빈도 수 : 4 ++++
84점의 빈도 수 : 10 ++++++++++
85점의 빈도 수 : 5 +++++
86점의 빈도 수 : 2 ++
87점의 빈도 수 : 5 +++++
88점의 빈도 수 : 6 ++++++
89점의 빈도 수 : 5 +++++
90점의 빈도 수 : 6 ++++++
91점의 빈도 수 : 4 ++++
92점의 빈도 수 : 7 +++++++
93점의 빈도 수 : 6 ++++++
94점의 빈도 수 : 4 ++++
95점의 빈도 수 : 3 +++
96점의 빈도 수 : 3 +++
97점의 빈도 수 : 5 +++++
98점의 빈도 수 : 1 +
99점의 빈도 수 : 5 +++++
100점의 빈도 수 : 6 ++++++
'''
while 문을 돌려
매번 최댓값에 해당하는 빈도수와 인덱스 값을 찾아내어 출력하고,
이미 찾아낸 값에 0을 대입함으로써 다시 돌릴 때마다 빈도수가 높은 것부터 해서 출력할 수도 있겠으나
\( O(N^2) \) 으로 코드가 비효율적일거 같아서
차라리 이중 포문을 만들어서, 인덱스와 value를 저장한 뒤, value를 기준으로 정렬하고 이를 출력하는게 더 낫다고 생각한다.
굳이 해보지는 않았다.
'알고리즘' 카테고리의 다른 글
[알고리즘] 병합 정렬 (0) | 2022.05.16 |
---|---|
[알고리즘] 재귀 알고리즘 (0) | 2022.05.15 |
[알고리즘] 선택정렬 (0) | 2022.05.15 |
[알고리즘] 삽입 정렬 (0) | 2022.05.15 |
[알고리즘] 버블정렬, 깊은 복사, 얕은 복사 (0) | 2022.05.14 |