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}')
```