제로베이스 데이터 취업 스쿨 - 26일차(6/26)

수야·2023년 6월 27일
0

근삿값

import random

nums = random.sample(range(0,50),20)
print(nums)
inputNum = int(input('숫자입력'))

nearNum = 0
minNum = max(nums)

for n in nums :
    absnum = abs(n - inputNum)
    print(f'absNum : {absnum}')

    if absnum < minNum :
        minNum = absnum
        nearNum = n
print(f'nearNum = {nearNum}')

근사값(실습)

kor = int(input('kor score: '))
eng = int(input('eng score: '))
sci = int(input('sci score: '))
mat = int(input('mat score: '))
his = int(input('his score: '))
totalScore = kor + eng + sci + mat + his
print(f'totalScore: {totalScore}')
average = totalScore / 5
print(f'averageScore: {average}')

def calScore(average):
    scoreList = [95, 85, 75, 65, 55]
    nearNum = 0
    minNum = 100
    for n in scoreList:
        absNum = abs(n - average)
        if absNum < minNum:
            minNum = absNum
            nearNum = n

    if nearNum == 95:
        return 'A'
    elif nearNum == 85:
        return 'B'
    elif nearNum == 75:
        return 'C'
    elif nearNum == 65:
        return 'D'
    elif nearNum <= 55:
        return 'F'

grade = calScore(average)
print(f'grade: {grade}')

평균

평균 실습

#다음은 어떤 체조 선수의 점수이다. 평균을 구하고 순위를 정하는 알고리즘을 만들어보자.
score = [8.9, 7.6,8.2,9.1,8.8,8.1,7.9,9.4,7.2,8.7]
score.sort()
top5score = [9.12, 8.95, 8.12, 7.90, 7.88]


total = 0
for n in score :
    total += n

average = total / len(score)
print(f'average : {average}')
top5score.append(average)
top5score.sort()

print(f'1위 : {top5score[len(top5score)-1]}')
print(f'2위 : {top5score[len(top5score)-2]}')
print(f'3위 : {top5score[len(top5score)-3]}')
print(f'4위 : {top5score[len(top5score)-4]}')
print(f'5위 : {top5score[len(top5score)-5]}')

재귀

나자신을 다시 호출하자

재귀알고리즘 실습

def gcd(n1, n2) :
    if n1 % n2 ==  0 :
        return  n2
    else:
        return gcd(n2, n1%n2)

print(f'gcd(82, 32) : {gcd(82, 32)}')

추가문제

문제: 팩토리얼 계산하기
주어진 양의 정수 n에 대해 n! (팩토리얼) 값을 구하는 재귀 알고리즘을 작성해보세요.

팩토리얼은 양의 정수 n에 대해 n부터 1까지의 모든 정수를 곱한 값입니다. 예를 들어, 5!은 5 x 4 x 3 x 2 x 1 = 120이 됩니다.

재귀 알고리즘을 사용하여 주어진 문제를 해결하는 함수를 작성해보세요. 함수의 이름은 factorial로 하고, 매개변수로 양의 정수 n을 받습니다. 함수는 n!의 값을 반환해야 합니다.

def factorial(n) :
    if n == 0 or n == 1:
        return  1
    else:
        return n * factorial(n-1)

print(factorial(5))

하노이의 탑

하노이의 탑 (실습)

def moveDisc(discCnt, fromBar, toBar, viaBar):
    if discCnt == 1 :
        print(f'{discCnt}disc move from {fromBar} to {toBar}.')
    else:
        moveDisc(discCnt-1, fromBar, viaBar, toBar)
        print(f'{discCnt}disc move from {fromBar}to {toBar}')
        moveDisc(discCnt-1, fromBar, toBar,viaBar)

moveDisc(3,1,3,2)

병합정렬


def merge_sort(arr):
    if len(arr) <= 1:  # 리스트의 길이가 1 이하면 이미 정렬된 상태이므로 종료
        return arr

    # 리스트를 반으로 나누기 위해 중간 지점을 계산
    mid = len(arr) // 2

    # 반으로 나눈 리스트를 재귀적으로 정렬
    left_half = merge_sort(arr[:mid])
    right_half = merge_sort(arr[mid:])

    # 두 개의 정렬된 리스트를 병합하여 새로운 정렬된 리스트 생성
    merged = merge(left_half, right_half)
    return merged


def merge(left, right):
    result = []  # 병합된 리스트를 저장할 빈 리스트 생성
    i, j = 0, 0  # 각각의 리스트에서 현재 비교할 원소의 인덱스 초기화

    # 두 개의 리스트를 비교하며 작은 순서대로 결과 리스트에 추가
    while i < len(left) and j < len(right):
        if left[i] <= right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1

    # 남은 원소들을 결과 리스트에 추가
    while i < len(left):
        result.append(left[i])
        i += 1

    while j < len(right):
        result.append(right[j])
        j += 1

    return result

병합 정렬 (실습)

# 1부터 100까지의 난수 10개를 생성하고,
# 다음의 요구사항을 만족하는 모듈을 만들어보자.
# 요구사항 1. 병합정렬 알고리즘을 이용한 난수정렬 모듈 구형
# 요구사항 2. 위의 모듈에 오름차순과 내림차순을 선택할 수 있는 옵션 추기
import random


def merge_sort(nsNum, asc=True) :
    if asc :
        if len(nsNum)<= 1 :
            return nsNum
        mid = len(nsNum)//2
        left_half = merge_sort(nsNum[:mid])
        right_half = merge_sort(nsNum[mid:])
        merged = merge(left_half, right_half)
        return merged
    else:
        if len(nsNum) <= 1:
            return nsNum
        mid = len(nsNum) // 2
        left_half = merge_sort(nsNum[:mid])
        right_half = merge_sort(nsNum[mid:])
        merged = merge(left_half, right_half)
        merged.sort(reverse=True)
        return merged


def merge(left, right) :
    result = []
    l, r = 0, 0

    while l < len(left) and r < len(right):
        if left[l] <= right[r]:
            result.append(left[l])
            l += 1
        else:
            result.append(right[r])
            r += 1
    while l < len(left):
        result.append(left[l])
        l += 1
    while r < len(right):
        result.append(right[r])
        r += 1
    return result

nsNum = random.sample(range(1,100),10)
asc = merge_sort(nsNum, asc=True)
dsc = merge_sort(nsNum, asc=False)
print(f'asc esult = {asc}')
print(f'dscresult = {dsc}')

퀵정렬

기준보다 작은 값과 큰 값을 분리한다.

def sort(ns):
    if len(ns) < 2:
        return ns
    mid = len(ns)//2
    midval = ns[mid]

    small = []; same = []; big = []

    for n in ns :
        if n < midval :
            small.append(n)
        elif n == midval :
            same.append(n)
        else:
            big.append(n)

    return  sort(small) + same + sort(big)

nums = [8,1,4,3,2,5,4,10,6,8]
result = sort(nums)
print(result)

퀵정렬(실습)

#1부터 100까지의 난수 10개를 생성하고, 다음의 요구 사항을 만족하는 모듈을 만들어보자.
# 요구사항 1. 퀵 정렬 알고리즘을 이용한 난수 정렬모듈 구현
# 요구사항 2. 위의 모듈에 오름차순과 내림차순을 선택할 수 있는 옵션 추가

def quickSort(nums , asc=True):
    if asc :
        if len(nums) ==0 or len(nums)==1:
            return nums
        midIndex = len(nums)//2
        midVal = nums[midIndex]

        small = []; same = []; big = []

        for n in nums :
            if n <midVal :
                small.append(n)
            elif n == midVal:
                same.append(n)
            else:
                big.append(n)
        return quickSort(small)+same+quickSort(big)
    else:
        if len(nums) == 0 or len(nums) == 1:
            return nums
        midIndex = len(nums) // 2
        midVal = nums[midIndex]

        small = [];
        same = [];
        big = []

        for n in nums:
            if n < midVal:
                small.append(n)
            elif n == midVal:
                same.append(n)
            else:
                big.append(n)
        result = quickSort(small) + same + quickSort(big)
        result.sort(reverse=True)
        return result


import random
nums = random.sample(range(1,100),10)
print(f'not sort : {nums}')
asc = quickSort(nums, asc=True)
print(f'asc sort : {asc}')
dsc = quickSort(nums, asc=False)
print(f'dsc sort : {dsc}')
```![](https://velog.velcdn.com/images/softwater/post/837949b7-ac27-4453-9c54-72365f3e5b6e/image.png)
profile
수야는 코린이에서 더 나아갈거야

0개의 댓글