Python 실습(최댓값, 최솟값, 최빈값, 근삿값, 재귀, 평균)

dumbbelldore·2024년 11월 24일
0

zero-base 33기

목록 보기
29/97

1. 최댓값 탐색 프로그램

  • 1 부터 50까지의 난수 30개를 추출한 뒤, 최댓값과 최댓값의 개수를 구하는 프로그램을 만드시오. (단, 난수 추출 시 중복이 허용되어야 한다.)
import random

num_list = list()

for num in range(30):
    num_list.append(random.randint(1, 50))
    
print(f"탐색 대상({len(num_list)}개): {num_list}")

max_num = num_list[0]
max_cnt = 0

for num in num_list:
    if num > max_num:
        max_num = num
        
for num in num_list:
    if max_num == num:
        max_cnt += 1

print(f"최댓값 탐색결과: {max_num}({max_cnt}개)")

# 출력 예시
# 탐색 대상(30개): [50, 2, 33, 31, 50, 8, 38, 50, 4, 8, 37, 38, 1, 18, 27, 6, 25, 1, 27, 46, 13, 16, 31, 32, 26, 32, 2, 43, 4, 22]
# 최댓값 탐색결과: 50(3개)

2. 최솟값 탐색 프로그램

  • 1 부터 50까지의 난수 30개를 추출한 뒤, 최솟값과 최솟값의 개수를 구하는 프로그램을 만드시오. (단, 난수 추출 시 중복이 허용되어야 한다.)
import random

num_list = list()

for num in range(30):
    num_list.append(random.randint(1, 50))
    
print(f"탐색 대상({len(num_list)}개): {num_list}")

min_num = num_list[0]
min_cnt = 0

for num in num_list:
    if num < min_num:
        min_num = num
        
for num in num_list:
    if min_num == num:
        min_cnt += 1

print(f"최솟값 탐색결과: {min_num}({min_cnt}개)")

# 출력 예시
# 탐색 대상(30개): [19, 11, 29, 35, 50, 45, 40, 8, 44, 41, 12, 24, 25, 20, 43, 50, 32, 24, 16, 26, 12, 31, 12, 39, 10, 38, 32, 21, 37, 41]
# 최솟값 탐색결과: 8(1개)

3. 빈도 탐색 프로그램

  • 1부터 45까지의 난수가 6개 든 내부 리스트를 총 30개 담고 있는 외부 리스트를 만들고, 외부 리스트에 포함된 모든 숫자의 빈도를 출력하는 프로그램을 만드시오.
import random

outer_list = list()

for _list in range(30):
    inner_list = list()
    
    for num in range(6):
        inner_list.append(random.randint(1, 45))
        
    outer_list.append(inner_list)

print("="*50)
print(f"1번째 내부 리스트: {outer_list[0]}")
print(f"15번째 내부 리스트: {outer_list[14]}")
print(f"30번째 내부 리스트: {outer_list[29]}")
print("="*50)

cnt_dict = dict()

for _list in outer_list:
    for num in set(_list):
        
        if not cnt_dict.get(num):
            cnt_dict[num] = 1
            
        else:
            cnt_dict[num] += 1
            
for num, cnt in cnt_dict.items():
    print(f"{num} -> {cnt}회 포함")
    
print("="*50)

# 출력 예시
# ==================================================
# 1번째 내부 리스트: [25, 42, 5, 2, 9, 24]
# 15번째 내부 리스트: [23, 6, 16, 13, 29, 3]
# 30번째 내부 리스트: [37, 13, 34, 7, 18, 40]
# ==================================================
# 2 -> 4회 포함
# 5 -> 3회 포함
# 9 -> 3회 포함
# (중략)
# 40 -> 3회 포함
# 15 -> 1회 포함
# 28 -> 1회 포함
# ==================================================

4. 근삿값 프로그램

  • 다음 표즌 수심에 따른 수온을 나타낸다. 근삿값 알고리즘을 이용해 수심을 입력하면 수온을 출력하는 프로그램을 만드시오.
수심(m)051015202530
수온(도)2422201613106
input_depth = int(input("수심(m) 입력: "))
print("="*10)
print(f"수심(m): {input_depth}")

temp_dict = {
    0: 24, 5: 22, 10: 20, 15: 16, 20: 13, 25: 10, 30: 6,
}

target_depth = 0
min_diff = 30

def get_temp(input_depth, min_diff):
    
    for depth in temp_dict.keys():
        diff = abs(depth - input_depth)
        
        if diff < min_diff:
            min_diff = diff
            target_depth = depth
        
    temp = temp_dict[target_depth]
    
    return temp

print(f"온도(도): {get_temp(input_depth, min_diff)}")

# 출력 예시
# 수심(m) 입력: 2
# ============
# 수심(m): 2
# 온도(도): 24

5. 재귀함수 프로그램 - 월별 매출 계산

  • 다음은 A상사의 2021년 월별 매출을 나타낸다. 재귀함수를 이용하여 1월부터 12월까지 전월대비 매출 증감액을 나타내는 프로그램을 만드시오.
1월2월3월4월5월6월7월8월9월10월11월12월
매출(천원)12,00013,00012,50011,00010,50098,00091,00091,50010,50011,50012,00012,500
sales = [12_000, 13_000, 12_500, 11_000, 10_500, 98_000, 
         91_000, 91_500, 10_500, 11_500, 12_000, 12_500]

def calc_diff(sales, idx=1):
    
    if idx == len(sales):
        return
    
    else:
        curr = sales[idx]
        prev = sales[idx-1]
        diff = curr-prev
        
        if diff > 0:
            print(f"{idx+1}월 전월대비 매출증감액: +{diff:,}원")
        
        else:
            print(f"{idx+1}월 전월대비 매출증감액: {diff:,}원")
            
        calc_diff(sales, idx=idx+1) # 재귀 호출

calc_diff(sales)

# 출력 예시
# 2월 전월대비 매출증감액: +1,000원
# 3월 전월대비 매출증감액: -500원
# (중략)
# 11월 전월대비 매출증감액: +500원
# 12월 전월대비 매출증감액: +500원

6. 재귀함수 프로그램 - 두 정수 사이 수 합 계산

  • 사용자가 정수 두 개 입력 시 작은 정수와 큰 정수 사이의 모든 정수의 합을 구하는 프로그램을 만드시오. (단, 재귀함수를 활용하시오.)
num1 = int(input("정수 1 입력: "))
num2 = int(input("정수 2 입력: "))

if num1 > num2:
    num1, num2 = num2, num1
    
def calc_sum(num1, num2, sum=0):
    
    if num1 == num2-1:
        return sum
    
    else:
        sum += (num1+1)
        return calc_sum(num1+1, num2, sum)

print(f"{num1}과 {num2} 사이의 정수 합: {calc_sum(num1, num2)}")

# 출력 예시
# 정수 1 입력: 3
# 정수 2 입력: 10
# 3과 10 사이의 정수 합: 39

7. 평균 프로그램

  • 다음은 한 체조선수의 경기 점수이다. 최댓값과 최솟값을 제외한 나머지 점수에 대한 평균을 구하고, 점수에 대한 순위를 정하는 프로그램을 만드시오. 또한, 해당 평균값을 현재 순위표에 반영하여 새로운 순위표를 구하시오.

    (참고) 경기 점수

    회차1회차2회차3회차4회차5회차6회차7회차8회차9회차10회차
    점수6.75.98.17.96.77.37.28.26.25.8

    (참고) 현재 순위표

    순위1위2위3위4위5위
    점수9.128.958.126.96.18
scores = [6.7, 5.9, 8.1, 7.9, 6.7, 7.3, 7.2, 8.2, 6.2, 5.8]

min_idx = 0
max_idx = 0
sum = 0
avg = 0
print("="*30)

# 평균 계산
for idx in range(len(scores)):
    
    curr_score = scores[idx]
    min_score = scores[min_idx]
    
    if curr_score < min_score:
        min_idx = idx

for idx in range(len(scores)):
    
    curr_score = scores[idx]
    max_score = scores[max_idx]
    
    if curr_score > max_score:
        max_idx = idx

scores.pop(min_idx)
scores.pop(max_idx)

for score in scores:
    sum += score

avg = round(sum / len(scores),1)

print(f"> 최대-최소값 제외평균: {avg}점")
print("="*30)

# 변동 순위표 계산
ranks = [9.12, 8.95, 8.12, 6.9, 6.18]

tgt_idx = -1

for idx in range(len(ranks)):
    if avg >= ranks[idx]:
        tgt_idx = idx
        break
        
if tgt_idx == -1:
    print("> 순위표 재산정 불필요")
    
else:
    print("> 순위표 재산정 필요")
    ranks.insert(tgt_idx, avg)
    ranks = ranks[:5]
    
    for idx, rank in enumerate(ranks):
        if idx == tgt_idx: 
            print(f"{idx+1}위: {rank}점 *")
        else:
            print(f"{idx+1}위: {rank}점")            
        
print("="*30)

# 출력 예시
# ==============================
# > 최대-최소값 제외평균: 7.0점
# ==============================
# > 순위표 재산정 필요
# 1위: 9.12점
# 2위: 8.95점
# 3위: 8.12점
# 4위: 7.0점 *
# 5위: 6.9점
# ==============================

*이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다.

profile
데이터 분석, 데이터 사이언스 학습 저장소

0개의 댓글