Day44. 알고리즘 (5)

Junghwan Park·2023년 6월 7일
0

스터디노트

목록 보기
44/54

근삿값 - 이론

  • 근사값 이란?
  • 특정 값(참값)에 가장 가까운 값을 근삿값이라고 한다!


    [7, 43, 14, 44, 6, 26, 24, 3, 25, 47, 2, 32, 27, 38, 18, 17, 33, 29, 28, 0]


    input number : 11


    입력받은 수와 절대값의 차가 가장 작은 수!
import random

nums = random.sample(range(0, 50), 20) # 중복이 있으면 안되므로 sample()로 뽑는다!
print(f'nums : {nums}')

inputNum = int(input('input number : '))
print(f'inputNum : {inputNum}')

nearNum = 0
minNum = 50 # 위에서 랜덤 샘플의 범위를 50까지로 했으므로!    # 가장 큰 값과 가장 작은값의 차이를 넣는 변수!    # 데이터가 많아지는 경우 최고값 알고리즘을 사용하여 최고값을 정해준다!

for i in nums:
    absNum = abs(i - inputNum)
    # print(f'absNum : {absNum}')

    if absNum < minNum:
        minNum = absNum
        nearNum = i

print(f'nearNum : {nearNum}')

근삿값 - 실습

  • 실습


    근삿값 알고리즘을 이용해서 시험 점수를 입력하면 학점이 출력되는 프로그램을 만들어보자!
    평균 점수에 따른 학점 기준 점수는 다음과 같다.


    ㆍ95에 근삿값이면 A학점
    ㆍ85에 근삿값이면 B학점
    ㆍ75에 근삿값이면 C학점
    ㆍ65에 근삿값이면 D학점
    ㆍ55에 근삿값이면 F학점

<실행파일코드>

import module_approximation

scores = []

kor = int(input('input kor score : '))
scores.append(kor)

eng = int(input('input eng score : '))
scores.append(eng)

mat = int(input('input mat score : '))
scores.append(mat)

sci = int(input('input sci score : '))
scores.append(sci)

his = int(input('input his score : '))
scores.append(his)

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

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

grade = module_approximation.getNearNum(avgScore)
print(f'grade : {grade}')

<모듈파일코드>

def getNearNum(an):

    baseScores = [95, 85, 75, 65, 55]   # 학점 기준값!
    nearNum = 0
    minNum = 100    # 100점을 넘을 수는 없으므로 100으로!

    for n in baseScores:
        absNum = abs(n - an)
        if absNum < minNum:
            minNum = absNum
            nearNum = n

    if nearNum == 95:
        return 'A'

    elif nearNum == 85:
        return 'B'

    elif nearNum == 75:
        return 'C'

    elif nearNum == 65:
        return 'D'

    elif nearNum <= 5:
        return 'F'

평균 - 이론

  • 평균 이란?
  • 평균을 구하자!


    여러 수나 양의 중간값을 갖는 수를 평균이라고 한다!
import random

nums = random.sample(range(0, 100), 10)
print(f'nums : {nums}')

total = 0

for n in nums:
    total += n

print(f'total : {total}')

average = total / len(nums)
print(f'average : {round(average, 2)}')

50이상 90이하 수들의 평균  (평균을 구할 수 의 조건 부여!)

import random

nums = random.sample(range(0, 100), 30)
print(f'nums : {nums}')

total = 0
targetNums = []

for n in nums:
    if n > 50 and n <= 90:  # 조건을 만족하는 수만 더하여 평균 구하기!
        total += n
        targetNums.append(n)


average = total / len(targetNums)
print(f'average : {round(average, 2)}')


# 정수들의 평균

nums = [4, 5.12, 0, 5, 7.34, 9.1, 9, 3 , 3.159, 1, 11, 12.789]
print(f'{nums}')

targetNums = []
total = 0

for n in nums:
    if n - int(n) == 0:  # 이 조건을 만족하면 정수라는 뜻!
        total += n
        targetNums.append(n)

average = total / len(targetNums)
print(f'targetNums : {targetNums}')
print(f'average : {round(average, 2)}')


# 실수들의 평균

nums = [4, 5.12, 0, 5, 7.34, 9.1, 9, 3 , 3.159, 1, 11, 12.789]
print(f'{nums}')

targetNums = []
total = 0

for n in nums:
    if n - int(n) != 0:  # 이 조건을 만족하면 실수라는 뜻!
        total += n
        targetNums.append(n)

average = total / len(targetNums)
print(f'targetNums : {targetNums}')
print(f'average : {round(average, 2)}')

평균 - 실습

  • 평균(실습)
  • 평균을 구하자!


    다음은 어떤 체조선수의 점수이다. 평균을 구하고 순위를 정하는 알고리즘을 만들어보자!

<실행파일코드>

import module_average

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

total = 0
average = 0

for i in scores:
    total += i

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

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

tp = module_average.Top5Players(top5PlayerScores, average)
tp.setAlignScore()
top5PlayerScores = tp.getFinalTop5Scores()
print(f'top5PlayerScores : {top5PlayerScores}')

<모듈파일코드>

class Top5Players:

    def __init__(self, cs, ns):

        self.currentScores = cs
        self.newScore = ns

    def setAlignScore(self):    # 새로운 점수가 들어오면 정렬해주는 것!

        nearIdx = 0
        nearScore = 0
        minNum = 10  # 0이 아닌 10점 만점이므로 10으로 해놔야한다!!

        for i, s in enumerate(self.currentScores):
            absNum = abs(self.newScore - s)

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

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

                self.currentScores[nearIdx] = self.newScore

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

                self.currentScores[nearIdx] = self.newScore

    def getFinalTop5Scores(self):
        return self.currentScores

재귀 - 이론

  • 재귀 알고리즘 이란?
  • 나 자신을 다시 호출하는 것을 재귀라고 한다!


    재귀함수도 조건이 없으면 무한반복 될 수 있다!
# 재귀함수로 * 찍어보기!

def recusion(num):

    if num > 0:
        print('*' * num)
        return recusion(num - 1)
    else:
        return 1

recusion(10)

재귀함수의 활용은 초급자는 어렵기 때문에 연습 필요!

# 10! = 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1

def factorial(num):

    if num > 0:
        return num * factorial(num - 1)
    else:
        return 1

print(f'factorial(10) : {factorial(10)}')

profile
안녕하세요 반갑습니다^^

0개의 댓글