[알고리즘] 최빈값

Stella·2023년 9월 4일

1. 최빈값

데이터에서 빈도수가 가장 많은 데이터를 최빈값이라고 한다.

nums = [1, 3, 7, 6, 7 ,7 ,7 , 12, 12 ,17]
indexes: [0,1,0,1,0,0,1,4,0,0,0,0,2,0,0,0,0,1]

nums을 for문을 사용하여 index에 숫자 값의 갯수 만큼 더해준다. 그러면 최빈값을 알 수 있다.

class MaxAlgorithm:
    def __init__(self, ns):
        self.nums = ns
        self.maxNum = 0
        self.maxNumIdx = 0
        # maxnum의 숫자와 maxnumidx의 값을 알려달라

    def setMaxIdxAndNum(self):
        self.maxNum = self.nums[0] # 처음값으로 초기화 해준다.
        self.maxNumIdx = 0 # idx도 0으로 일단 초기화 해준다.

        # 최댓값을 구한다. i index와 n 숫자
        for i, n in enumerate(self.nums): # 사용자가 처음 넣은 데이터를 받는다. 반복문을 돌린다.
            if self.maxNum < n: # 숫자가 n보다 작으면
                self.maxNum = n # 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]
maxAlo = MaxAlgorithm(nums) # 최댓값이 무엇인지 모를때
maxAlo.setMaxIdxAndNum()
maxNum = maxAlo.getMaxNum()
print(f'maxNum: {maxNum}')

indexes = [0 for i in range(maxNum + 1)] # 18개가 나오기 위해 +1를 해준다.
# 가장 큰 데이터가 무엇이고, 가장 큰 index가 무엇인가
print(f'indexes: {indexes}')
print(f'indexes length: {len(indexes)}')

# 인덱스의 값을 추가해주기 위해서
for n in nums:
    indexes[n] = indexes[n] + 1 # 누적된 값이 더해진다.
print(f'indexes: {indexes}')
# 최댓값을 확인하기 위해 눈으로 확인하기 어렵기 때문에
maxAlo = MaxAlgorithm(indexes)
maxAlo.setMaxIdxAndNum()
maxNum = maxAlo.getMaxNum()
maxNumIdx = maxAlo.getMaxNumIdx()
print(f'maxNum: {maxNum}')
print(f'maxNumIdx: {maxNumIdx}')

print(f'즉, {maxNumIdx}의 빈도수가 {maxNum}로 가장 높다.')

최빈값 구하는 알고리즘을 처음 도전해봤는데 생각보다 나는 항상 겁을 먹는것 같다 ^_ㅠ
막상 이해 하고나면 그렇게 어렵지 않은데 앞으로 더 많이 도전해야지!

- 실습

최빈값 알고리즘을 이용해서 학생 100명의 점수 분포를 다음과 같이 나타내보자.

import random
import main as ms

# socres배열을 생성한다.
scores = []

# 71부터 100까지 랜덤 점수를 생성한다.
# 배열의 값을 5단위로 만들어준다
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.setMaxNumIdxAndNum()
maxNum = maxAlo.getMaxNum()
print(f'maxNum: {maxNum}')

# 인덱스 리스트 생성
indexes = [0 for i in range(maxNum + 1)]
print(f'indexes: {indexes}')
print(f'indexes length: {len(indexes)}')

# 인덱스 리스트에 빈도를 저장한다.
for n in scores:
    indexes[n] = indexes[n] + 1 # 한 번 등장할 때마다 +1을 해준다.
print(f'indexes: {indexes}')

# 가시화 해서 코드를 만든다.
n = 1
while True:
    maxAlo = ms.MaxAlgorithm(indexes)
    maxAlo.setMaxNumIdxAndNum()
    maxNum = maxAlo.getMaxNum()
    maxNumIdx = maxAlo.getMaxNumIdx()

    if maxNum == 0:
        break
    print(f'{n}. {maxNumIdx}빈도수: {maxNum}\t', end='')
    print('+' * maxNum)

    # 가장 높은 녀석의 값을 0으로 찍고 2위로 빈도수가 높은 값이 1위로 순위가 변경 된다.
    indexes[maxNumIdx] = 0
    n += 1

점점 갈수록 코드가 길어지는 것 같아서 조금 당황스럽다 ㅎ;
하지만 이해는 잘 되어가고 있으니깐 발전하는거 맞겠지..?
ㅎㅎㅎㅎ
킵고잉

profile
공부 기록

0개의 댓글