[제로베이스] 4주차_알고리즘 03

해오름·2023년 2월 21일
0

[zb]

목록 보기
2/18

📌2/21 영상강의 6_019 ~ 6_030

근삿값

특정 값에 가장 가까운 값
🖥️ 근삿값 알고리즘을 이용해 시험점수를 입력하면 학점이 출력되는 프로그램을 만들어보자

#모듈
def getNearNUm(an):

    baScores = [95, 85, 75, 65, 55]
    nearNum = 0
    minNum = 100

    for n in baScores:
        absNum = abs(n - an)
        if minNum > absNum:
            minNum = absNum
            nearNum = n

    if nearNum == 95:  # 위의 for문 연산의 결과값이 if문에 쓰이므로 들여쓰지 않는다.
        return 'A'

    elif nearNum == 85:
        return 'B'

    elif nearNum == 75:
        return 'C'

    elif nearNum == 65:
        return 'D'

    elif nearNum == 55:
        return 'F'
        
        
 #호출부
 import near

scores = []

kor = int(input('국어 점수 입력 : '))
scores.append(kor)
eng = int(input('영어 점수 입력 : '))
scores.append(eng)
mat = int(input('수학 점수 입력 : '))
scores.append(mat)
sci = int(input('과학 점수 입력 : '))
scores.append(sci)
his = int(input('역사 점수 입력 : '))
scores.append(his)

totalScore = sum(scores)
print(f'totalScore:{totalScore}')

avgScores = totalScore / len(scores)
print(f'avgScores:{avgScores}')

gread = near.getNearNUm(avgScores)
print(f'gread:{gread}')
  • minNum에 최댓값을 할당하여 if문을 시작하고 가장 작은 점수차이의 절대값(absNum)을 담아준다.

평균

여러 수나 양의 중간값
🖥️점수표의 평균을 구하고 순위를 정하는 알고리즘을 만들어보자

#모듈
class Top5Players:

    def __init__(self,cs,ns):
        self.currentScore = cs
        self.newScore = ns

    def setAlignScore(self):
        nearIdx = 0
        nearScore = 0
        minNum = 10.0

        for idx, s in enumerate(self.currentScore):
             absNum = abs(self.newScore - s)

             if absNum < minNum:
                 minNum = absNum
                 nearIdx = idx
                 nearScore = s


        if self.newScore >= self.currentScore[nearIdx]:
            for i in range(len(self.currentScore)-1,nearIdx,-1):
                 self.currentScore[i] = self.currentScore[i -1]🔥

            self.currentScore[nearIdx] = self.newScore

        else:                                              
            for i in range(len(self.currentScore) -1, nearIdx+1, -1):
                 self.currentScore[i] = self.currentScore[i -1]

            self.currentScore[nearIdx] = self.newScore

    def getFinalTop5Scores(self):
        return self.currentScore

#호출부

import near

scores = [8.9, 7.6, 8.2, 9.1, 8.8, 8.1, 7.9, 9.4, 7.2, 8.7]
top5PlayerScore = [9.12, 8.95, 8.12, 7.90, 7.88]
print(f'top5PlqyerScore:{top5PlayerScore}')

total = 0; avg = 0
for n in scores:
    total += n

avg = round(total / len(scores),2)

print(f'total:{total}')
print(f'avg:{avg}')

tp = near.Top5Players(top5PlayerScore,avg)
tp.setAlignScore()
result = tp.getFinalTop5Scores()
print(f'result:{result}')
  • self.currentScore[i] = self.currentScore[i -1]🔥
    -> self.currentScore의 값들이 하나씩 뒤로 밀려야하는데 왜 인덱스값은 +1이 아니고 -1인지 이해가 잘 안된다.. for문의 방향성을 봐야하나

재귀 알고리즘

나 자신을 다시 호출하는 것을 재귀라고 한다.

하노이의 탑

병합 정렬

자료 구조를 분할하고 각각의 분할된 자료구조를 정렬한 후 다시 병합하여 정렬한다

퀵정렬

기준 값보다 작은 값과 큰 값으로 분리한 후 다시 합친다.

마무리
재귀 함수 가까워지기 넘 어려운것.. 내일 하노이 탑부터 다시 복습하기...
내일은 코딩테스트도 있고 팀 스터디도 있어서 시간을 좀좀따리 잘 나눠서 써야할 것 같다

profile
study note

0개의 댓글