[4주차] 알고리즘 4

이철민·2023년 2월 20일

[최솟값]

  • 최솟값: 자료구조에서 가장 작은 값을 찾는다.
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:
                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}')
  • 최솟값 실습)
    • 리스트에서 아스키코드가 가장 작은 값을 찾는 알고리즘을 만들어보자.
chars = ['c', 'x', 'Q', 'A', 'e', 'P','p']

class MinAlgorithm:

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

    def getMinChar(self):
        self.minChar = self.chars[0]

        for n in self.chars:
            if ord(self.minChar) > ord(n):
                self.minChar = n

        return self.minChar

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

[최빈값]

  • 데이터에서 빈도수가 가장 많은 데이터를 최빈값이라고 한다.
nums = [1, 3, 7, 6, 7, 7, 7, 12, 12, 17]   # 최댓값을 먼저 구해야함.

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

        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

maxAlo = MaxAlgorithm(nums)
maxAlo.setMaxIdxAndNum()
maxNum = maxAlo.getMaxNum()
print(f'maxNum: {maxNum}')    # 최댓값 17을 찾았기 때문에 이제 인덱스 0~17까지의 리스트를 생성하면 된다.

indexes = [0 for i in range(maxNum+1)]
print(f'indexes: {indexes}')
print(f'indexes length: {len(indexes)}')

for n in nums:
    indexes[n] = indexes[n] + 1    # indexes[n]이 처음엔 0이지만 n이 한번 등장할때마다 1씩 증가
print(f'indexes: {indexes}')

maxAlo = MaxAlgorithm(indexes)    # indexes의 최댓값을 한번 더 구함
maxAlo.setMaxIdxAndNum()
maxNum = maxAlo.getMaxNum()
maxNumIdx = maxAlo.getMaxNumIdx()
print(f'maxNum: {maxNum}')
print(f'maxNumIdx: {maxNumIdx}')

print(f'즉,{maxNumIdx}의 빈도수가 {maxNum}로 가장 높다')
  • 최빈값 실습)

모듈: maxScore

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 maxScore as ms

scores = []

for i in range(100):
    rn = random.randint(71, 100)
    if rn != 100: rn = rn - (rn % 5)    # 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
print(f'indexes: {indexes}')

n = 1
while True:

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

    if maxNum == 0:
        break

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

    indexes[maxNumIdx] = 0    # 가장 높은 값을 가진 숫자 처리를 했으면 얘를 0으로 만들어야 그 다음으로 큰 숫자 처리 가능.

    n += 1
profile
늘 온 마음을 다해 :)

0개의 댓글