제로베이스 데이터 스쿨/일일 스터디 노트
17일차 스터디노트 / 파이썬 알고리즘(검색, 순위, 정렬, 최댓값,최솟값,최빈값,근삿값) 연습문제
김뎀뎀
2023. 1. 24. 23:58
※제로베이스 데이터 취업스쿨 11기 수강 중
📗 17일차 공부 내용 요약
파이썬 알고리즘에 대한 연습문제를 풀었다
- 검색(이진검색, 선형검색), 순위, 정렬(버블정렬, 삽입정렬, 선택정렬), 최댓값, 최솟값, 최빈값, 근삿값
📖 17일차 공부 내용 자세히
Q.숫자로 이루어진 리스트에서 사용자가 입력한 숫자를 검색하는 모듈을 다음 요건에 따라 만들어보자.
1. 검색모듈은 이진 검색 알고리즘을 이용하자
2. 리스트는 [1,2,4,6,7,8,10,11,13,15,16,17,20,21,24,24,27,28]을 이용하자
3. 검색 과정을 로그로 출력하자
4. 검색에 성공하면 해당 정수의 인덱스를 출력하고, 검색 결과가 없다면 -1을 출력하자
#모듈
def searchNumberByBinaryAlgorithm(ns, sn):
searchResultIdx = -1
staIdx = 0
endIdx = len(ns) - 1
midIdx = (staIdx + endIdx) // 2
midVal = ns[midIdx]
print(f'staIdx: {staIdx}, endIdx: {endIdx}')
print(f'midIdx: {midIdx}, midVal: {midVal}')
while sn >= ns[0] and sn <= ns[len(ns) - 1]:
if sn == ns[len(ns) - 1]:
searchResultIdx = len(ns) - 1
break
if staIdx + 1 == endIdx: #반복문 조건내에는 속하지만 리스트에 없는 수의 경우
if ns[staIdx] != sn and ns[endIdx] != sn:
break
if sn > midVal:
staIdx = midIdx
midIdx = (staIdx + endIdx) // 2
midVal = ns[midIdx]
print(f'+staIdx: {staIdx}, endIdx: {endIdx}')
print(f'+midIdx: {midIdx}, midVal: {midVal}')
elif sn < midVal:
endIdx = midIdx
midIdx = (staIdx + endIdx) // 2
midVal = ns[midIdx]
print(f'-staIdx: {staIdx}, endIdx: {endIdx}')
print(f'-midIdx: {midIdx}, midVal: {midVal}')
elif sn == midVal:
searchResultIdx = midIdx
break
return searchResultIdx
#실행
import binaryMod
import random
if __name__ == '__main__':
nums = [1, 2, 4, 6, 7, 8, 10, 11, 13, 15, 16, 17, 20, 21, 23, 24, 27, 28]
searchNum = int(input('input search number: '))
resultIdx = binaryMod.searchNumberByBinaryAlgorithm(nums, searchNum)
print(f'nums: {nums}')
if resultIdx == -1:
print('No results found.')
print(f'search result index: {resultIdx}')
else:
print('>>> Search Results <<<')
print(f'search result index: {resultIdx}')
print(f'search result number: {nums[resultIdx]}')
Q. 숫자로 이루어진 리스트를 버블정렬 알고리즘을 이용해서 오름차순과 내림차순으로 정렬하는 모듈을 만들어보자.
#모듈
import copy
def sortBybubleSortAlgorithm(ns, asc=True):
c_ns = copy.copy(ns) #깊은복사
length = len(c_ns) - 1
for i in range(length):
for j in range(length-i):
if asc:
if c_ns[j] > c_ns[j+1]:
c_ns[j], c_ns[j+1] = c_ns[j+1], c_ns[j]
else:
if c_ns[j] < c_ns[j+1]:
c_ns[j], c_ns[j+1] = c_ns[j+1], c_ns[j]
print(f'ns: {c_ns}')
print()
return c_ns
#실행
import random
import bubleMod
if __name__ == '__main__':
nums = random.sample(range(1, 20), 10)
print(f'not sorted nums: {nums}')
result = bubleMod.sortBybubleSortAlgorithm(nums)
print(f'sorted nums by ASC: {result}')
result = bubleMod.sortBybubleSortAlgorithm(nums, asc=False)
print(f'sorted nums by DESC: {result}')
Q.학급 전체 학생의 시험 점수에 대한 평균과 최솟값을 구하고 평균과 최솟값의 편차를 출력하는 프로그램을 최솟값 알고리즘을 이용해서 만들어보자
scores = [100, 64, 94, 66, 75, 58, 99, 76, 96, 74, 54, 73, 88, 70, 68, 50, 95, 89, 69, 98]
#모듈(클래스 활용)
class ScoreManagement:
def __init__(self, ss):
self.scores = ss
self.score_tot = 0
self.score_avg = 0
self.score_min = 0
self.score_max = 0
def getMinScore(self):
if self.scores == None or len(self.scores) == 0:
return None #아직 socres가 초기화가 안되었다면 none 반환
self.score_min = self.scores[0]
for score in self.scores:
if self.score_min > score:
self.score_min = score
return self.score_min
def getMaxScore(self):
if self.scores == None or len(self.scores) == 0:
return None
self.score_max = self.scores[0]
for score in self.scores:
if self.score_max < score:
self.score_max = score
return self.score_max
def getTotScore(self):
if self.scores == None or len(self.scores) == 0:
return None
self.score_tot = 0
for score in self.scores:
self.score_tot += score
return self.score_tot
def getAvgScore(self):
if self.scores == None or len(self.scores) == 0:
return None
self.score_avg = round(self.getTotScore() / len(self.scores), 2)
return self.score_avg
def getMaxDeviation(self):
result = abs(self.getAvgScore() - self.getMaxScore())
return round(result, 2)
def getMinDeviation(self):
result = abs(self.getAvgScore() - self.getMinScore())
return round(result, 2)
#실행
scores = [100, 64, 94, 66, 75, 58, 99, 76, 96, 74,
54, 73, 88, 70, 68, 50, 95, 89, 69, 98]
import mod2
sm = mod2.ScoreManagement(scores)
print(f'score_avg: {sm.getAvgScore()}')
print(f'score_min: {sm.getMinScore()}')
print(f'score_max: {sm.getMaxScore()}')
print(f'score_min_deviation: {sm.getMinDeviation()}')
print(f'score_max_deviation: {sm.getMaxDeviation()}')
Q.사용자의 몸무게(kg)와 키(m)를 입력하면 체질량지수(BMI)를 계산하고, 근삿값 알고리즘과 BMI표를 이용해서 신체상태를 출력하는 프로그램을 만들어보자.
#모듈
class BmiAlgorithm:
def __init__(self, w, h):
self.BMISection = {18.5:['저체중', '정상'],
23:['정상','과체중'],
25:['과체중', '비만']}
self.userWeight = w
self.userHeight = h
self.userBMI = 0
self.userCondition = ''
self.nearNum = 0
self.minNum = 25
def calculatorBMI(self):
self.userBMI = round(self.userWeight / (self.userHeight * self.userHeight), 2)
print(f'userBMI: {self.userBMI}')
def printUserCondition(self):
for n in self.BMISection.keys():
absNum = abs(n - self.userBMI)
if absNum < self.minNum:
self.minNum = absNum
self.nearNum = n
print(f'self.nearNum: {self.nearNum}')
if self.userBMI <= self.nearNum:
self.userCondition = self.BMISection[self.nearNum][0]
else:
self.userCondition = self.BMISection[self.nearNum][1]
print(f'self.userCondition: {self.userCondition}')
#실행
import nearMod
uWeight = float(input('input weight(Kg): '))
uHeight = float(input('input height(m): '))
na = nearMod.BmiAlgorithm(uWeight, uHeight)
na.calculatorBMI()
na.printUserCondition()
➰ N일차 후기
처음에는 머리 아팠던 정렬 부분도, 다시 복습하니 조금씩 익숙해지기 시작한다.
클래스도 배운지 좀 되서 가물가물했는데, 연습문제를 풀면서 계속 활용하다보니 다시 생각나고 손에 익어서 다행이었다.
연휴에 공부를 한다는 게 쉽지 않았지만,, 그래도 하고나니 뿌듯하다 ~!
※본 내용은 제로베이스 데이터 취업 스쿨에서 제공하는 학습 내용에 기반합니다.