[제로베이스] 4주차_알고리즘 02

해오름·2023년 2월 20일
0

[zb]

목록 보기
1/18

📌2/20 영상강의 6_009 ~ 6_018

삽입 정렬

정렬되어 있는 자료 배열과 비교해서, 정렬 위치를 찾는다.

🖥️1~1000까지 난수 100개 생성 후 오름차순, 내림차순 정렬, 최솟값, 최댓값 반환하기

#모듈
class SortNumbers:

    def __init__(self,ns,asc=True):
        self.nums = ns
        self.isAsc = asc

    def isAscending(self,flag):
        self.isAsc = flag

    def setSort(self):

        for i1 in range(1, len(self.nums)):
            i2 = i1 - 1
            cNum = self.nums[i1]

            if self.isAsc:
                while self.nums[i2] > cNum and i2 >= 0:
                    self.nums[i2+1] = self.nums[i2]
                    i2 -= 1

            else:
                while self.nums[i2] < cNum and i2 >= 0:
                    self.nums[i2 + 1] = self.nums[i2]
                    i2 -= 1

            self.nums[i2 + 1] = cNum


    def getSortedNumbers(self):
        return self.nums

    def getMinNumber(self):
        if self.isAsc:
            return self.nums[0]
        else:
            return self.nums[len(self.nums)-1]

    def getMaxNumber(self):
        if self.isAsc:
            return self.nums[len(self.nums)-1]

        else:
            return self.nums[0]
            
 # 모듈 실행
import random
import sortMod as sm

nums = random.sample(range(1,1000),100)
print(f'not sorted numbers:{nums}')

#객체 생성
sn = sm.SortNumbers(nums)

#오름차순(ascending)
sn.setSort()
sortedNumbers = sn.getSortedNumbers()
print(f'sortedNumbers by ASC:{sortedNumbers}')

#내림차순(descending)
sn.isAscending(False)
sn.setSort()
sortedNumbers = sn.getSortedNumbers()
print(f'sortedNumbers by DESC:{sortedNumbers}')

#min & max
print(f'min :{sn.getMinNumber()}')
print(f'max :{sn.getMaxNumber()}')
  • 두번째 값부터 앞 값과 비교한다
  • 내림차순으로 정렬할 때 sn.isAscending(False)

선택 정렬

리스트중 최솟값을 찾아 그 값을 맨 앞에 위치한 값과 교체하는 방식으로 자료를 정렬한다

🖥️ 50~100 사이의 시험점수 20개를 무작위로 생성하고 선택정렬 알고리즘을 이용해 오름차순, 내림차순 정렬하는 모듈을 만들어보자

#모듈
def sortNumber(ns,asc=True):

    if asc:
        for i in range(len(ns)-1):
            minIdx = i
            for j in range(i+1,len(ns)):
                if ns[minIdx] > ns[j]:
                    minIdx = j

            ns[i],ns[minIdx] = ns[minIdx],ns[i]

    else:
        for i in range(len(ns) - 1):
            minIdx = i
            for j in range(i + 1, len(ns)):
                if ns[minIdx] < ns[j]:
                    minIdx = j

            ns[i], ns[minIdx] = ns[minIdx], ns[i]

    return ns
    
#실행 파일

import random
import sortMod as sm
import copy

scores = random.sample(range(50,101),20)
# print(f'scores = {scores}')
print(f'scores length = {len(scores)}')

print(f'scores = {scores}')
result = sm.sortNumber(copy.deepcopy(scores))
print(f'result:{result}')

print(f'scores = {scores}')
result = sm.sortNumber(copy.deepcopy(scores), asc =False )
print(f'result:{result}')
  • 모듈에 인수를 던지기 전에 copy.deepcopy(리스트명)로 하면
    모듈에서는 복사본이 연산되어 원본리스트를 유지할 수 있다.(깊은복사)

최댓값

자료구조에서 가장 큰 값

최솟값

자료구조에서 가장 작은 값

최빈값

데이터에서 빈도수가 가장 많은 데이터

🖥️70~100점 사이의 100명의 시험 점수 분ㅋ포를 최빈값 알고리즘을 이용해 아래와같이 나타내보자

#모듈

class MaxAlgorithm:

    def __init__(self,sc):
        self.scres = sc
        self.maxNum = 0
        self.maxNumIdx = 0

    def setMaxNumAndIdx(self):
        self.maxNum = self.scres[0]
        self.maxNumIdx = 0

        for i, n in enumerate(self.scres):
            if self.maxNum < n:
                self.maxNum = n
                self.maxNumIdx = i

    def getMaxNum(self):
        return self.maxNum

    def getMaxIdx(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)
    scores.append(rn)

print(f'scores:{scores}')
print(f'scores length:{len(scores)}')

#최댓값 알고리즘
maxAlo = ms.MaxAlgorithm(scores)
maxAlo.setMaxNumAndIdx()
maxNum = maxAlo.getMaxNum()

print(f'MaxNum:{maxNum}')

# 인덱스 리스트 생성
indexes = [0 for i in range(maxNum+1)]

# 인덱스 리스트에 빈도 저장
for s in scores:
    indexes[s] = indexes[s] + 1

# print(f'indexes:{indexes}')

n=1
while True:

    maxAlo = ms.MaxAlgorithm(indexes)
    maxAlo.setMaxNumAndIdx()
    maxNum = maxAlo.getMaxNum()
    maxIdx = maxAlo.getMaxIdx()
    # print(f'MaxNum:{maxNum}')
    # print(f'maxIdx:{maxIdx}')

    if maxNum == 0:
        break

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

    indexes[maxIdx] = 0

    n += 1
  • 기존 리스트에서 구한 최댓값만큼 0만 있는 리스트를 만들어서, 기존리스트의 숫자(값)에 해당하는 0의 인덱스값이 1씩 더해진다. 말로는 어렵다..

마무리
최댓값 최솟값 최빈값은 괜찮은데 다른 정렬은..
파이썬 모듈에 있는거 쓰고싶은 맴
모듈로 만들어서 쓰는 부분 복습하고싶은데 시간이 왜이리 부족한지 모르겠다
오늘도 현타가 많이 왔지만 찰리푸스 노래를 듣고 이겨냈다. 하지만 흥이 나서 공부에 쪼끔 방해된다

profile
study note

0개의 댓글