21. 알고리즘_문풀3~5

wonny_·2023년 7월 29일
0

자료구조&알고리즘

목록 보기
10/10
  • 최댓값 알고리즘
Q. 최댓값 알고리즘 이용해서 숫자로 이루어진 리스트에서 최댓값의 개수를 찾는 모듈(리스트는 1-50까지 난수 30개 이용하되, 중복 허용) 

<mergeAl 모듈>

class MaxAlgorithm:

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

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

       for num in self.nums:
           if num >= self.maxNum:
               self.maxNum = num

   def getMaxNum(self):
       self.setMaxNum()
       return self.maxNum

  def setMaxNumCnt(self):
      for n in self.nums:
          if self.maxNum == n:
               self.maxNumCnt += 1
               
  def getMaxNumCnt(self):
      return self.maxNumCnt
_________________________________________    
<실행문> 

import random
import mergeAl as ma

if __name__ == '__main__':

   nums = []
   for n in range(30):
       nums.append(random.randint(1,50))
   print(f'nums: {nums}')
   result = ma.MaxAlgorithm(nums)
   result.setMaxNum()
   result.setMaxNumCnt()
   print(f'max num: {result.getMaxNum()}')
   print(f'max num cnt: {result.getMaxNumCnt()}')

  • 최솟값 알고리즘
Q. 최솟값 알고리즘을 이용해서 숫자로 이루어진 리스트에서 최솟값과 최솟값의 개수를 찾는 모듈(리스트는 1-50까지 난수 30개 이용하되, 중복 허용) 

<minMode 모듈>

class MinAlgorithm:

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

    def setMinNum(self):
        self.minNum = 51

        for n in self.nums:
            if self.minNum > n:
                self.minNum = n
                
    def getMinNum(self):
        self.getMinNum()
        return self.minNum
        
   def setMinNumCnt(self):
       self.setMinNum()

       for n in self.nums:
           if self.minNum == n:
               self.minNumCnt += 1
               
   def getMinNumCnt(self):
      self.setMinNumCnt()
      return self.minNumCnt
__________________________________________

 <실행문>
 
 import random
 import minMod
 if __name__ == '__main__':

    nums = []
    for n in range(30):
        nums.append(random.randint(1, 50))

    print(f'nums: {nums}')
    ma = minMod.MinAlgorithm(nums)
    print(f'min num: {ma.setMinNum()}')
    print(f'min num cnt: {ma.getMinNumCnt()}')

  • 최빈값
Q. 회차별 로또 번호. 최빈도 알고리즘을 이용해서 모든 회차의 각각의 번호에 대한 빈도수를 출력

<mod 모듈>

class LottoMode:

    def __init__(self, ln):
        self.lottoNums = ln
        self.modeList = [0 for n in range(1, 47)]

    def getLottoNumMode(self):
        for roundNums in self.lottoNums:
            for num in roundNums:
                self.modeList[num] = self.modeList[num] +1

        return self.modeList

    def printModeList(self):
        if sum(self.modeList) == 0:
            return None

        for i, m in enumerate(self.modeList):
            if i != 0:
                print(f'번호: {i:>2}, 빈도: {m},{"*"* m}')
__________________________________________________________
<실행문>

import mod
lottoNums = [[13, 23,15, 5, 6, 39],[36, 13, 5, 3, 30, 16], [43, 1, 15, 9, 3, 38],
     [32, 42, 24, 45, 8, 31], [18, 39, 41, 11, 4, 9], [12, 39, 11, 38, 32, 5],
     [29, 25, 13, 6, 14, 8], [21, 33, 19, 20, 42, 7], [6, 28, 3, 45, 41, 24],
     [42, 15, 8, 5, 35, 4], [14, 4, 35, 24, 29, 3], [15, 20, 6, 37, 34, 39],
     [27, 5, 32, 15, 25, 19], [33, 28, 45, 21, 38, 24], [4, 30, 29, 28, 32, 38],
     [25, 26, 45, 23, 24, 16], [33, 28, 45, 21, 38, 24], [4, 30, 29, 28, 32, 38],
     [11, 28, 12, 2, 42, 3], [40, 29, 16, 8, 9, 28], [6, 9, 37, 30, 3, 35],
     [29, 18, 41, 28, 38, 15], [9, 31, 13, 44, 1, 36], [36, 1, 37, 32, 15, 12],
     [41, 32, 16, 6, 26, 33], [12, 43, 10, 29, 39, 9], [41, 9, 23, 35, 18, 17],
     [35, 38, 3, 28, 36, 31], [21, 44, 4, 29, 18, 7], [20, 23, 6, 2, 34, 44]]

lm = mod.LottoMode(lottoNums)
mlist = lm.getLottoNumMode()
#print(f'mList: {mlist}')
lm.printModeList()

  • 근삿값
Q.  근삿값 알고리즘을 이용해서 수심을 입력하면 수온 출력하는 모듈 

 <mearMod 모듈>
 
 class NearAlgorithm:

     def __init__(self,d):
        self.temps = {0:24, 5:22, 10:20, 15:16, 20:13, 25:10, 30:6}
        self.depth = d
        self.nearNum = 0
        self.minNum = 24

     def getNearNumbers(self):

         for n in self.temps.keys():
             absNum = abs(n - self.depth)
             if absNum < self.minNum:
                self.minNum = absNum
                self.nearNum = n

         return self.temps[self.nearNum]
 ________________________________________________________________
 <실행문>
 
 import mearMod

depth =  int(float(input('input depth: ')))
print(f'depth: {depth}m')

na = mearMod.NearAlgorithm(depth)
temp = na.getNearNumbers()
print(f'water temperature: {temp}ºC')

  • 재귀 알고리즘
Q. A상사의 2021년 월별 매출 증감액을 재귀 알고리즘을 이용하여 출력 
     
sales = [1200, 1300, 12500, 11000, 10500, 98000, 91000, 91500, 10500, 11500, 12000, 12500]
def salesUpAndDown(ss):

    if len(ss) == 1:
        return  ss

    print(f'sales: {ss}')
    currentSales = ss.pop(0) #12000 제거를해서 currentSales에 담아
    nextSales = ss[0]
    increase = nextSales - currentSales
    if increase > 0:
        increase = '+' + str(increase)

    print(f'매출 증감액: {increase}')

    return salesUpAndDown(ss)

if __name__ == '__main__':
   salesUpAndDown(sales)

  • 평균 알고리즘
Q. 홍길동 학생을 제외한 나머지 학생의 평균과 홍길동 학생의 점수 차이 출력 

kor_avg = 88; eng_avg = 82; mat_avg = 90; sci_avg = 78; his_avg = 92
hong_kor = 85; hong_eng = 90; hong_mat = 82; hong_sci = 88; hong_his = 100

stu19Cnt_kor_total = kor_avg * 20 - hong_kor
stu19Cnt_eng_total = kor_avg * 20 - hong_eng
stu19Cnt_mat_total = kor_avg * 20 - hong_mat
stu19Cnt_sci_total = kor_avg * 20 - hong_sci
stu19Cnt_his_total = kor_avg * 20 - hong_his

stu19Cnt_kor_avg = stu19Cnt_kor_total / 19
stu19Cnt_eng_avg = stu19Cnt_eng_total / 19
stu19Cnt_mat_avg = stu19Cnt_mat_total / 19
stu19Cnt_sci_avg = stu19Cnt_sci_total / 19
stu19Cnt_his_avg = stu19Cnt_his_total / 19

kor_gap = hong_kor - stu19Cnt_kor_avg
eng_gap = hong_eng - stu19Cnt_eng_avg
mat_gap = hong_mat - stu19Cnt_mat_avg
sci_gap = hong_sci - stu19Cnt_sci_avg
his_gap = hong_his - stu19Cnt_his_avg

print(f'국어점수 차이: {"+"+str(round(kor_gap, 2)) if kor_gap > 0 else round(kor_gap, 2)}')
print(f'영어점수 차이: {"+"+str(round(eng_gap, 2)) if eng_gap > 0 else round(eng_gap, 2)}')
print(f'수학점수 차이: {"+"+str(round(mat_gap, 2)) if mat_gap > 0 else round(mat_gap, 2)}')
print(f'과학점수 차이: {"+"+str(round(sci_gap, 2)) if sci_gap > 0 else round(sci_gap, 2)}')
print(f'역사점수 차이: {"+"+str(round(his_gap, 2)) if his_gap > 0 else round(his_gap, 2)}')

stu19Cnt_total = stu19Cnt_kor_avg + stu19Cnt_eng_avg + stu19Cnt_mat_avg + stu19Cnt_sci_avg + stu19Cnt_his_avg
stu19Cnt_avg = stu19Cnt_total / 5

hong_total = hong_kor + hong_eng + hong_mat + hong_sci + hong_his
hong_avg = hong_total / 5

avg_gap = round(hong_avg - stu19Cnt_avg, 2)
print(f'평균점수 차이: {"+"+str(round(avg_gap, 2)) if avg_gap>0 else round(avg_gap,2)}') 

profile
파이팅

0개의 댓글