[데이터사이언스12기-스터디노트]파이썬(23.02.07.)

도윤수·2023년 2월 7일
0

Python스터디노트

목록 보기
6/16
post-thumbnail

📝스터디노트 6일차 범위

파이썬 중급 문제풀이 3 ~ 5

📖 비행기 요금표 출력(할인 기능 포함)

지난 문제풀이 2와 비슷하게 함수를 활용하여 출력물과 같은 결과를 내는 문제였다.

#비행기 요금표 출력(할인 포함)
childPrice = 18000
infanPrice = 25000
adultPrice = 50000
specialDC = 50

#천 단위로 , 찍는 함수 ***모르던 것***
def fomatedNumber(n):
    return format(n, ',')

def printAirPlaneReceipt(c1,c2, i1, i2, a1, a2):
    print('=' * 40)
    cp = c1 * childPrice
    cp_dc = int(c2 * childPrice * 0.5)
    print(f'유아 {c1}명 요금: {fomatedNumber(cp)}원')
    print(f'유아 할인 대상 {c2}명 요금: {fomatedNumber(cp_dc)}원')

    ip = i1 *infanPrice
    ip_dc = int(i2 * infanPrice * 0.5)
    print(f'소아 {i1}명 요금: {fomatedNumber(ip)}원')
    print(f'소아 할인 대상 {i2}명 요금: {fomatedNumber(ip_dc)}원')

    ap = a1 * adultPrice
    ap_dc = int(a2 * adultPrice * 0.5)
    print(f'성인 {a1}명 요금: {fomatedNumber(ap)}원')
    print(f'성인 할인 대상 {a2}명 요금: {fomatedNumber(ap_dc)}원')
    print('=' * 40)
    print(f'Total: {c1 + c2 + i1 + i2 + a1 + a2}')
    print(f'TotalPrice: {fomatedNumber(cp + cp_dc + ip + ip_dc + ap + ap_dc)}원')

childCnt = int(input('유아 입력: '))
specialChildCnt = int(input('할인 대상 유아 입력: '))

infantCnt = int(input('소아 입력: '))
specialInfantCnt = int(input('할인 대상 소아 입력: '))

aultCnt = int(input('성인 입력: '))
specialAdultCnt = int(input('할인 대상 성인 입력: '))

printAirPlaneReceipt(childCnt, specialChildCnt,
                     infantCnt, specialInfantCnt,
                     aultCnt, specialAdultCnt)
print('=' * 40)

또 길다..
이젠 그러려니 한다. 적응해야 살아남는다.

  1. 전역 변수로 유아(child), 소아(infan), 성인(adult)기준 금액들을 선언해준다.
  2. 인수로 받아야 할 것이 유아, 유아 할인, 소아, 소아 할인, 성인, 성인 할인 이라 함수의 매개변수역시 6개로 지정.
  3. 일반 가격은 각 인원 금액이고, 할인 가격은 인원 금액 * 0.5(50%할인) 이다.
  4. 인수를 각각의 Cnt로 입력 받는다. ★인원수를 입력받아 계산해야하기 때문에 int로 캐스팅 중요!!!!★
  5. 그리고 요금표 함수를 불러와 입력값들을 넣어주면

    이쁜 3인 가족의 비행기 티켓 영수증이 출력된다.

설명안한 fomatedNumber 함수는 금액이 구분점 없이 "TotalPrice: 139500" 이런 식으로 출력되는 것을 "TotalPrice: 139,500" 로 바꿔주는 함수이다.

강의에서는 없었지만 파이썬의 기본 함수인 format(숫자, ',') 함수이다.
다른 방법으로는 print(f'{숫자:,}') ,print('{0:.}'.format(숫자)) 등의 방법이 있다.
다 한번씩 연습해보는 것도 좋지만 함수로 선언해놓고 호출하는게 편할 듯 하다.

📖 비행기 요금표 출력(할인 기능 포함)

① 입력 값의 팩토리얼 출력하기.

def formatedNumber(n):
    return format(n, ',')

def recursionFun(n):  #재귀함수

    if n == 1:
        return n   #n이 1이면 끝난다.

    return n * recursionFun(n-1)   #n-1을 계속해서 호출하면서 n 이 1 이 될때까지 곱해준다.

intputNumber = int(input('input number: '))
print(format(recursionFun(intputNumber), ',')) #이렇게 format함수를 사용하던지, 위에서 함수를 선언하던지
  1. 함수안에서 자기자신을 호출하는 recursion(재귀함수)을 선언한다.
  2. 팩토리얼은 자기자신부터 -1 씩 곱해나가는 함수이기 때문에 1까지 갔을 때 종료되고 반환하면 된다.
  3. 이 함수는 나와 나보다 -1인 값을 곱한 값을 반환한다.
  4. 값을 입력하면 결과가 나오고 앞서말한 formatedNumber 함수를 활용해서 결과를 이쁘게 출력.

코드도 짧고 간단해 보이지만 처음 이 문제를 보고 생각했을 땐 머리속에서 난리를 치고있었다.
전날 연습했던 것처럼 함수에서 함수를 호출하는 효율적인 방법들을 익숙해질때까지 반복하는 것이 중요해보인다.

② 단리 / 월복리 계산하는 함수 만들기.
몰랐던 부분이라 설명해놓고 넘어가자면
단리 : 기간, 예산에 상관없이 최초 원금에 대한 이자만 붙는다.
복리 : 원금에 이자가 붙은 금액에 이자가 붙어 나가는 형태. 이자에 이자가 붙는다.

## 단리 / 월복리 계산기 함수 만들기.
def formatedNumber(n):
    return format(n, ',')

# 단리는 최초 원금에 대해서만 이자가 붙는다.
def singleRateCalculator(m, t, r):

    totalMoney = 0
    totalRateMoney = 0

    for i in range(t):
        totalRateMoney += m * r * 0.01

    totalMoney = m + totalRateMoney
    return int(totalMoney)   #totalRateMoney 에서 0.01 때문에 int로

# 월복리
def multiRateCalculator(m, t, r):

    t = (t * 12)  # 기간이 (년) 단위라 월로 바꿔준다.
    rpm = (r / 12) * 0.01

    totalMoney = m

    for i in range(t):
        totalMoney += totalMoney * rpm

    return int(totalMoney)

money = int(input('예치금(원): '))
term = int(input('기간(년): '))
rate = int(input('연 이율(%): '))

print('[단리 계산기]')
print('=' * 40)
print(f'예치금\t: {money}원')
print(f'예치기간\t: {term}년')
print(f'연 이율\t: {rate}%')
print('-' * 40)
print(f'{term}년 후 총 수령액: {formatedNumber(singleRateCalculator(money, term, rate))}')
print('=' * 40)
print('')
print('[복리 계산기]')
print('=' * 40)
print(f'예치금\t: {money}원')
print(f'예치기간\t: {term}년')
print(f'연 이율\t: {rate}%')
print('-' * 40)
print(f'{term}년 후 총 수령액: {formatedNumber(multiRateCalculator(money, term, rate))}')

이 문제... 길고도 험했다. 중간에 빠트린 부분이 생겨서 질문도 해버렸었다...

  1. 크게 단리 계산함수, 복리 계산함수를 선언한다. 두 함수 모두 매개변수로(금액, 기간, 이율)을 받는다.
    ----------------------------------------[단리]----------------------------------------
  2. 이자율을 for 문을 통해 i 가 t(기간)까지 금액 이율 0.01(백분율)로 구한다.
  3. 총 금액은 초기 금액 + 총 이자금액 이고, 돈이 소수점으로 나올 수 없기 때문에 ★int로 캐스팅
    ----------------------------------------[복리]----------------------------------------
  4. 월 복리이기 때문에 기간을 12로 나누어 한달치 이자율을 계산하기 쉽게 만들어준다.
  5. 이자율(rate per money)도 같이 나눠주고 0.01(백분율)도 곱해준다.
  6. money(금액), term(기간), rate(이율)을 입력값으로 받고,
  7. 입력값을 \t 를 활용해 일정 칸 탭을 해주어 정렬해준다.
  8. 앞서 사용한 formatedNumber를 가져와 이쁘게 서식에 맞추어 출력한다.

입력값을 int로 캐스팅하지 않고 코드를 돌리니 계산이 안된다는 error가 나지...
error 나는 순간 벙쪄서 이게 안보이고 검색하고 있었다.
지금보니 별거 아닌걸 깨우쳤으니 앞으로도 천천히 따져가면서 해석하면 실력이 향상될 것이라 믿는다.

📖 등차수열의 합 구하기

등차수열은 초기값 부터 공차 만큼씩 n 항까지 나아가는 수열이다.
이 문제도 보자마자 노가다성 코드가 생각났다...

#등차수열의 합 구하기.
def sequenceCal(n1, d, n): # d=공차

    valueN = 0;# n항의 값
    sumN =0; # n 항까지 합의 값

    i = 1
    while i <= n: # i 가 n 보다 작거나 같을떄 까지
        if i == 1:
            valueN = n1   #초항
            sumN += valueN
            print(f'{i}번쨰 항의 값: {valueN}')
            print(f'{i}번쨰 항까지의 값: {sumN}')

            i += 1  # i가 n보다 크게되면 스톱
            continue

        valueN += d
        sumN += valueN
        print(f'{i}번쨰 항의 값: {valueN}')
        print(f'{i}번쨰 항까지의 값: {sumN}')

        i += 1   # i에 +1씩 해줘야 무한반복에 빠지지 않음.

inputN1 = int(input('a1 입력: '))
inputD = int(input('공차 입력: '))
inputN = int(input('n 입력: '))

sequenceCal(inputN1, inputD, inputN)
  1. sequenceCal(등차수열의 합을 구하는 함수)는 매개변수로 (n1(초항), d(공차), n(마지막항))을 갖는다.
  2. i = 1 부터 while문으로 i 가 n 보다 같거나 작을 때까지 계속 돌린다. 하지만 i 가 1이면 초항이 곧 끝이다. 그래서 i += 1 을 해주고 continue로 진행시켜~
  3. 이전 값(valueN)에 공차 d를 계속 += d 더해주고 그 값을 등차수열의 합 sumN 에 넣어준다.
  4. 그리고 중요한 ★ 무한루프에 빠지지 않기 위해 i += 1 을 해준다!!
  5. 입력값을 int로 캐스팅해서 받고 함수를 호출하면 결과가 나온다.

    초항은 1 이고 공차는 3 이고 7 번째까지의 합을 구하는 함수였다.

🔥🔥 바쁜시간 쪼개서 매일매일 성장해 나가는 모습을 기록하자!🔥🔥

profile
DataScience를 하고 싶은 DoIT

0개의 댓글