데이터 스쿨 4주차 학습내용 정리 - 3

호진·2023년 11월 21일
0

AI_스쿨

목록 보기
11/51
post-thumbnail

최댓값, 최솟값

최댓값(maximum)은 자료 구조에서 가장 큰 값을 의미합니다. 최솟값(minimum)은 자료 구조에서 가장 작은 값을 의미합니다.

최댓값과 최솟값을 구하는 알고리즘은 다음과 같습니다.

class MaxAlgorithm:
    def __init__(self, ns):
    
        self.nums = ns  # 입력된 숫자들을 클래스 변수로 저장
        self.maxNum = 0  # 최댓값을 저장할 변수를 초기화

    def getMaxNum(self):
        # 입력된 숫자들 중에서 최댓값을 찾는 메서드
        self.maxNum = self.nums[0]  # 초기값으로 첫 번째 숫자를 설정

        for i in self.nums:
            # 리스트를 순회하면서 최댓값을 찾음
            if self.maxNum < i:
                self.maxNum = i

        return self.maxNum  # 찾은 최댓값 반환

# MaxAlgorithm 클래스의 인스턴스 생성
ma = MaxAlgorithm([-2, -4, 5, 7, 10, 0, 8, 20, -11])
# getMaxNum 메서드 호출하여 최댓값 찾기
maxNum = ma.getMaxNum()
# 결과 출력
print(f'maxNum: {maxNum}')

최댓값 구하는 클레스

class MiniAlgorithm:

    def __init__(self, ns):
        self.nums = ns
        self.minNum = 0

    def getMinNum(self):
        self.minNum = self.nums[0]

        for n in self.nums:
            if self.minNum > n:
                self.minNum = n
        return self.minNum

nums = [-2, -4, 5, 7, 10, 0, 8, 20, -11]
ma = MiniAlgorithm(nums)
minNum = ma.getMinNum()
print(minNum)

최솟값구하는 클레스

함수로 선언하면 더 쉽게 만들 수 있지만 최빈값과 근삿값을 구하기 위한 빌드업 이기때문에 클레스로 강의 하신것으로 보인다.

최빈값

최빈값(mode)은 자료 구조에서 가장 많이 나타나는 값을 의미합니다.

최빈값을 구하는 알고리즘은 다음과 같습니다.

class MaxAlgorithm:
    def __init__(self, ns):
        self.nums = ns  # 입력된 숫자들을 클래스 변수로 저장
        self.maxNum = 0  # 최댓값을 저장할 변수를 초기화
        self.MaxNumIdx = 0  # 최댓값의 인덱스를 저장할 변수를 초기화

    def setMaxIdxAndNum(self):
        # 입력된 숫자들 중에서 최댓값과 그 인덱스를 찾는 메서드
        self.maxNum = self.nums[0]  # 초기값으로 첫 번째 숫자를 설정
        self.MaxNumIdx = 0  # 초기값으로 첫 번째 숫자의 인덱스를 설정

        # enumerate를 사용하여 숫자와 인덱스에 동시에 접근
        for i, n in enumerate(self.nums):
            if self.maxNum < n:
                # 현재 숫자가 최댓값보다 크면 최댓값과 인덱스 갱신
                self.maxNum = n
                self.MaxNumIdx = i

    def getMaxNum(self):
        # 최댓값 반환
        return self.maxNum

    def getMaxNumIdx(self):
        # 최댓값의 인덱스 반환
        return self.MaxNumIdx

# 주어진 숫자 리스트
nums = [1, 3, 7, 6, 7, 7, 7, 12, 12, 17]

# MaxAlgorithm 클래스의 인스턴스 생성
maxAlo = MaxAlgorithm(nums)

# setMaxIdxAndNum 메서드 호출하여 최댓값과 인덱스 찾기
maxAlo.setMaxIdxAndNum()

# 최댓값과 인덱스 출력
maxNum = maxAlo.getMaxNum()
maxNumIdx = maxAlo.getMaxNumIdx()
print(f"최댓값: {maxNum}")
print(f"최댓값의 인덱스: {maxNumIdx}")

# 각 숫자의 등장 횟수를 세기 위한 리스트 초기화
indexes = [0 for i in range(maxNum + 1)]

# 각 숫자의 등장 횟수를 세어 indexes 리스트에 저장
for i in nums:
    indexes[i] = indexes[i] + 1

# 등장 횟수를 가지고 다시 MaxAlgorithm 클래스의 인스턴스 생성
maxAlo = MaxAlgorithm(indexes)

# setMaxIdxAndNum 메서드 호출하여 등장 횟수의 최댓값과 인덱스 찾기
maxAlo.setMaxIdxAndNum()

# 등장 횟수의 최댓값과 인덱스 출력
countNum = maxAlo.getMaxNum()
countNumIdx = maxAlo.getMaxNumIdx()
print(f"등장 횟수의 최댓값: {countNum}")
print(f'가장 많이 있는 숫자 : {countNumIdx}, 횟수 : {countNum}')

해당 코드는 최빈값은 최댓값을 구하는 클레스를 두번을 거처 구하는 방식이다.
원리를 설명드리면 리스트 내부에서 가장 큰 값을 구하고(가장 작은값은 0이라 가정) 가장큰 값만큰의 0을 가진 리스트0를 생성하고 리스트 내부의 값을 한번씩 꺼내 값에 해당하는 리스트0의 인덱스에 해당하는 값에 1씩 더하고 다시 한번 최댓값을 출력하는 인덱스를 돌리면 최댓값은 최빈값의 출력 빈도를 나타내고 인덱스 값은 최빈값을 나타내게 됩니다.

근삿값

근삿값(approximation)은 자료 구조에서 특정 값에 가장 가까운 값을 의미합니다.
근삿값을 구하는 알고리즘은 다음과 같습니다.

import random
rNum = random.sample(range(1, 50), 20)
print(rNum)
inputNum = int(input('숫자를 입력하세요 : '))

nearNum = 0
minNum = 50
for n in rNum:
    abNum = abs(n - inputNum)
    if abNum < minNum:
        minNum = abNum
        nearNum = n

print(minNum)
print(nearNum)

해당 코드는 무작위의 난수 20개 중에서 사용자가 입력한 값과 가장 근사한 값을 찾는 코드인데 우선 for문을 사용하여 리스트 내부의 숫자를 하나씩 끄집어내어 사용자가 입력한 값과의 차를 절댓값을 취한뒤 abNum에 저장하여 minNum과 비교하여 abNum이 더 작으면 minNum에 저장하는 식으로 하여 절댓값이 가장 작은 값을 출력하게됩니다. 절댓값의 크기가 작다는 말은 가장 근사하다는 뜻이기때문이죠

예제

kor = int(input('input kor score : '))
en = int(input('input en score : '))
mat = int(input('input mat score : '))
sci = int(input('input sci score : '))
his = int(input('input his score : '))

grade = [55, 65, 75, 85, 95]
totalS = kor + en + mat + sci + his
avgS = round((totalS / 5), 2)
print(f'totalScore : {totalS}')
print(f'avgScore : {avgS}')
maxN = 100
nearNum = 0
for grade in grade:
     absN = abs(grade - avgS)
     if absN < maxN:
         maxN = absN
         nearNum = grade

         if nearNum == 95:
             gradeRank = 'A'
         elif nearNum == 85:
             gradeRank = 'B'
         elif nearNum == 75:
             gradeRank = 'C'
         elif nearNum == 65:
             gradeRank = 'D'
         elif nearNum == 55:
             gradeRank = 'F'

print(f'grade : {gradeRank}')

평균의근사값이 가장 가까운 값을 찾아 등급을 맥이는 예제였습니다.

평균

평균(average)은 자료 구조의 모든 요소의 합을 요소의 개수로 나눈 값을 의미합니다.

평균을 구하는 알고리즘은 다음과 같습니다.

import random

nums = random.sample(range(0, 100), 30)
print(nums)

total = 0
targetList = []
for i in nums:
    if i >= 50 and i <= 90:
        total += i
        targetList.append(i)
avg = total / len(targetList)
print(avg)

평균을 모르는 사람은 없을꺼라 생각하고 자세한 설명은 생략하겠습니다.

profile
중요한 건 꺽였는데도 그냥 하는 마음

0개의 댓글