📌2/20 영상강의 6_009 ~ 6_018
정렬되어 있는 자료 배열과 비교해서, 정렬 위치를 찾는다.
🖥️1~1000까지 난수 100개 생성 후 오름차순, 내림차순 정렬, 최솟값, 최댓값 반환하기
#모듈
class SortNumbers:
def __init__(self,ns,asc=True):
self.nums = ns
self.isAsc = asc
def isAscending(self,flag):
self.isAsc = flag
def setSort(self):
for i1 in range(1, len(self.nums)):
i2 = i1 - 1
cNum = self.nums[i1]
if self.isAsc:
while self.nums[i2] > cNum and i2 >= 0:
self.nums[i2+1] = self.nums[i2]
i2 -= 1
else:
while self.nums[i2] < cNum and i2 >= 0:
self.nums[i2 + 1] = self.nums[i2]
i2 -= 1
self.nums[i2 + 1] = cNum
def getSortedNumbers(self):
return self.nums
def getMinNumber(self):
if self.isAsc:
return self.nums[0]
else:
return self.nums[len(self.nums)-1]
def getMaxNumber(self):
if self.isAsc:
return self.nums[len(self.nums)-1]
else:
return self.nums[0]
# 모듈 실행
import random
import sortMod as sm
nums = random.sample(range(1,1000),100)
print(f'not sorted numbers:{nums}')
#객체 생성
sn = sm.SortNumbers(nums)
#오름차순(ascending)
sn.setSort()
sortedNumbers = sn.getSortedNumbers()
print(f'sortedNumbers by ASC:{sortedNumbers}')
#내림차순(descending)
sn.isAscending(False)
sn.setSort()
sortedNumbers = sn.getSortedNumbers()
print(f'sortedNumbers by DESC:{sortedNumbers}')
#min & max
print(f'min :{sn.getMinNumber()}')
print(f'max :{sn.getMaxNumber()}')
- 두번째 값부터 앞 값과 비교한다
- 내림차순으로 정렬할 때 sn.isAscending(False)
리스트중 최솟값을 찾아 그 값을 맨 앞에 위치한 값과 교체하는 방식으로 자료를 정렬한다
🖥️ 50~100 사이의 시험점수 20개를 무작위로 생성하고 선택정렬 알고리즘을 이용해 오름차순, 내림차순 정렬하는 모듈을 만들어보자
#모듈
def sortNumber(ns,asc=True):
if asc:
for i in range(len(ns)-1):
minIdx = i
for j in range(i+1,len(ns)):
if ns[minIdx] > ns[j]:
minIdx = j
ns[i],ns[minIdx] = ns[minIdx],ns[i]
else:
for i in range(len(ns) - 1):
minIdx = i
for j in range(i + 1, len(ns)):
if ns[minIdx] < ns[j]:
minIdx = j
ns[i], ns[minIdx] = ns[minIdx], ns[i]
return ns
#실행 파일
import random
import sortMod as sm
import copy
scores = random.sample(range(50,101),20)
# print(f'scores = {scores}')
print(f'scores length = {len(scores)}')
print(f'scores = {scores}')
result = sm.sortNumber(copy.deepcopy(scores))
print(f'result:{result}')
print(f'scores = {scores}')
result = sm.sortNumber(copy.deepcopy(scores), asc =False )
print(f'result:{result}')
- 모듈에 인수를 던지기 전에 copy.deepcopy(리스트명)로 하면
모듈에서는 복사본이 연산되어 원본리스트를 유지할 수 있다.(깊은복사)
자료구조에서 가장 큰 값
자료구조에서 가장 작은 값
데이터에서 빈도수가 가장 많은 데이터
🖥️70~100점 사이의 100명의 시험 점수 분ㅋ포를 최빈값 알고리즘을 이용해 아래와같이 나타내보자
#모듈
class MaxAlgorithm:
def __init__(self,sc):
self.scres = sc
self.maxNum = 0
self.maxNumIdx = 0
def setMaxNumAndIdx(self):
self.maxNum = self.scres[0]
self.maxNumIdx = 0
for i, n in enumerate(self.scres):
if self.maxNum < n:
self.maxNum = n
self.maxNumIdx = i
def getMaxNum(self):
return self.maxNum
def getMaxIdx(self):
return self.maxNumIdx
#실행 파일
import random
import maxScore as ms
scores = []
for i in range(100):
rn = random.randint(71,100)
if rn != 100: rn = rn - (rn % 5)
scores.append(rn)
print(f'scores:{scores}')
print(f'scores length:{len(scores)}')
#최댓값 알고리즘
maxAlo = ms.MaxAlgorithm(scores)
maxAlo.setMaxNumAndIdx()
maxNum = maxAlo.getMaxNum()
print(f'MaxNum:{maxNum}')
# 인덱스 리스트 생성
indexes = [0 for i in range(maxNum+1)]
# 인덱스 리스트에 빈도 저장
for s in scores:
indexes[s] = indexes[s] + 1
# print(f'indexes:{indexes}')
n=1
while True:
maxAlo = ms.MaxAlgorithm(indexes)
maxAlo.setMaxNumAndIdx()
maxNum = maxAlo.getMaxNum()
maxIdx = maxAlo.getMaxIdx()
# print(f'MaxNum:{maxNum}')
# print(f'maxIdx:{maxIdx}')
if maxNum == 0:
break
print(f'{n}.{maxIdx}빈도수: {maxNum}\t', end='')
print('+' * maxNum)
indexes[maxIdx] = 0
n += 1
- 기존 리스트에서 구한 최댓값만큼 0만 있는 리스트를 만들어서, 기존리스트의 숫자(값)에 해당하는 0의 인덱스값이 1씩 더해진다. 말로는 어렵다..
마무리
최댓값 최솟값 최빈값은 괜찮은데 다른 정렬은..
파이썬 모듈에 있는거 쓰고싶은 맴
모듈로 만들어서 쓰는 부분 복습하고싶은데 시간이 왜이리 부족한지 모르겠다
오늘도 현타가 많이 왔지만 찰리푸스 노래를 듣고 이겨냈다. 하지만 흥이 나서 공부에 쪼끔 방해된다