[제로베이스] 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개의 댓글

관련 채용 정보