Day43. 알고리즘 (4)

Junghwan Park·2023년 6월 2일
0

스터디노트

목록 보기
43/54

최솟값 - 이론

  • 최솟값
  • 자료구조에서 가장 작은 값을 찾는다!
class MinAlgorithm:

    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: # minNum보다 작은값이 있다는 것은 minNum이 최소값이 아니라는 뜻!
                self.minNum = n

        return self.minNum

nums = [-2, -4, 5, 7, 10, 0, 8, 20, -11]
ma = MinAlgorithm(nums)
minNum = ma.getMinNum()
print(f'minNum : {minNum}')

최솟값 - 실습

  • 최솟값(실습)
  • 리스트에서 아스키코드가 가장 작은 값을 찾는 알고리즘을 만들어보자!
class MaxAlgorithm:

    def __init__(self, cs):
        self.chars = cs
        self.minChar = 0

    def getMinChar(self):

        self.minChar = self.chars[0]    # 외부에서 받은 chars 리스트의 가장 첫번째 값으로 초기화!

        for c in self.chars:
            if ord(self.minChar) > ord(c):  # ord() 문자를 아스키코드값으로 변환해 주는 함수!
                self.minChar = c

        return self.minChar

chars = ['c', 'x', 'Q', 'A', 'e', 'P', 'p']

mc = MaxAlgorithm(chars)
minChar = mc.getMinChar()
print(f'minChar : {minChar}')


class CharToAscii():

    def __init__(self, css):

        self.chars = css
        self.ordChars = []

    def changeord(self):

        for o in self.chars:
            aaa = ord(o)
            self.ordChars.append(aaa)

        return self.ordChars

chars = ['c', 'x', 'Q', 'A', 'e', 'P', 'p']
mc = CharToAscii(chars)
ordChar = mc.changeord()
print(f'ordChar : {ordChar}')

최빈값 - 이론

  • 최빈값(mode)
  • 데이터에서 빈도수가 가장 많은 데이터를 최빈값이라고 한다!


    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, 1] 숫자를 인덱스 번호로 생각하고 거기에 하나씩 더 해준다!
    0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

최대값을 먼저 구해야함 → 최대값을 끝으로하는 리스트를 만들어야 하므로!

class MaxAlgorithme:

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

    def setMaxIdxAndNum(self):
        self.maxNum = self.nums[0]
        self.maxNumIdx = 0

        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]

maxAlo = MaxAlgorithme(nums)
maxAlo.setMaxIdxAndNum()
maxNum = maxAlo.getMaxNum()
print(f'maxNum : {maxNum}')

indexes = [0 for i in range(maxNum + 1)]    # 최대값만큼 0으로 채워진 리스트 생성!
print(f'indexes : {indexes}')
print(f'indexes length : {len(indexes)}')

for n in nums:
    indexes[n] = indexes[n] + 1 # 해당 인덱스가 등장할때마다 +1!

print(f'indexes : {indexes}')   # 가장 많이 등장한 수의 인덱스가 수가 가장 크다!!

maxAlo = MaxAlgorithme(indexes)
maxAlo.setMaxIdxAndNum()
maxNum = maxAlo.getMaxNum()
maxNumIdx = maxAlo.getMaxNumIdx()
print(f'maxNum : {maxNum}')
print(f'maxNumIdx : {maxNumIdx}')

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

최빈값 - 실습

  • 최빈값(실습)

모듈 파일 코드

class MaxAlgorithm:

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

    def setMaxNumIdxAndNum(self):
        self.maxNum = self.nums[0]
        self.maxNumIdx = 0

        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

실행 파일 코드

import random
import module_mode as mm

scores = []

for i in range(100):
    rn = random.randint(71, 100)    # 71 ~ 100점까지
    if rn != 100: rn = rn - (rn % 5)    # 5로 나눈 나머지를 빼주면 5단위로 끊을 수 있다!
    scores.append(rn)
    
print(f'scores : {scores}')
print(f'scores length: {len(scores)}')

# 최대값
maxAlgo = mm.MaxAlgorithm(scores)
maxAlgo.setMaxNumIdxAndNum()
maxNum = maxAlgo.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
print(f'indexes : {indexes}')

n = 1
while True:

    maxAlgo = mm.MaxAlgorithm(indexes)
    maxAlgo.setMaxNumIdxAndNum()
    maxNum = maxAlgo.getMaxNum()
    maxNumIdx = maxAlgo.getMaxNumIdx()
    # print(f'maxNum : {maxNum}')
    # print(f'maxNumIdx : {maxNumIdx}')

    if maxNum == 0:
        break

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

    indexes[maxNumIdx] = 0  # 이 코드가 없으면 가장 큰놈만 계속 출련된다!

    n += 1

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

0개의 댓글