파이썬 중급 문제풀이

조지원·2023년 5월 15일

python

목록 보기
8/15


💻 keep going

몇몇 문제들은 이해를 못 해서 그냥 넘어가기도 했다.


💡 함수 01

산술연산 계산기를 함수를 이용해서 만들기

def add(n1, n2) :
    return n1 + n2

def sub(n1, n2) :
    return n1 - n2

def mul(n1, n2) :
    return n1 * n2

def div(n1, n2) :
    return n1 / n2

def mod(n1, n2) :
    return n1 % n2

def flo(n1, n2) :
    return n1 // n2

def exp(n1, n2) :
    return n1 ** n2




while True :

    print("-" * 80)
    selectNum = int(input("1.덧셈, 2.뺄셈, 3.곱셈, 4.나눗셈, 5.나머지, 6.몫, 7.제곱승, 8.종료"))

    if selectNum < 1 or selectNum > 8 :
        print("다시 입력하세요")
        break

    if selectNum == 8 :
        print("Bye~")
        break

    num1 = float(input("첫 번째 숫자 입력 : "))
    num2 = float(input("두 번째 숫자 입력 : "))

    if selectNum == 1:
        print(f"{num1} + {num2} : {add(num1, num2)}")
        print("-" * 80)


    elif selectNum == 2:
        print(f"{num1} - {num2} : {sub(num1, num2)}")
        print("-" * 80)


    elif selectNum == 3:
        print(f"{num1} * {num2} : {mul(num1, num2)}")
        print("-" * 80)


    elif selectNum == 4:
        try :
            print(f"{num1} / {num2} : {div(num1, num2)}")
        except :
            print("다시 입력해 주세요")

        print("-" * 80)


    elif selectNum == 5:
        print(f"{num1} % {num2} : {mod(num1, num2)}")
        print("-" * 80)


    elif selectNum == 6:
        print(f"{num1} // {num2} : {flo(num1, num2)}")
        print("-" * 80)


    elif selectNum == 7:
        print(f"{num1} ** {num2} : {exp(num1, num2)}")
        print("-" * 80)



    else :
        print("잘못 입력하셨습니다. 다시 입력하세요.")

🔥 결과 :

--------------------------------------------------------------------------------
1.덧셈, 2.뺄셈, 3.곱셈, 4.나눗셈, 5.나머지, 6., 7.제곱승, 8.종료1
첫 번째 숫자 입력 : 30
두 번째 숫자 입력 : 50
30.0 + 50.0 : 80.0

--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
1.덧셈, 2.뺄셈, 3.곱셈, 4.나눗셈, 5.나머지, 6., 7.제곱승, 8.종료2
첫 번째 숫자 입력 : 80
두 번째 숫자 입력 : 30
80.0 - 30.0 : 50.0

--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

1.덧셈, 2.뺄셈, 3.곱셈, 4.나눗셈, 5.나머지, 6., 7.제곱승, 8.종료5
첫 번째 숫자 입력 : 5
두 번째 숫자 입력 : 3
5.0 % 3.0 : 2.0

--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
1.덧셈, 2.뺄셈, 3.곱셈, 4.나눗셈, 5.나머지, 6., 7.제곱승, 8.종료8
Bye~


💡 함수 02

이동거리와 이동시간을 반환하는 함수 만들기

# 이동한거리 : 거리(km) = 속도(km/h) * 시간(h)
def getDistance(speed, hour, minute) :
    distance = speed * (hour + minute / 60)
    return distance

# 걸린 시간 : 시간 = 거리 / 속도

# 분 : 100:75 = 60:x  --> x = 75 * 60 / 100
# 컴퓨터에서는 100:75로 연산하니까 바꿔줘야함

def getTime(speed, distance) :
    time = distance / speed
    h = int(time)
    m = int((time - h) * 100 * 60 / 100)

    return [h, m] # 값이 2개이기 때문에 리스트형(자로구조형)으로 묶어야함

print("-" * 50)
s = float(input("속도(km/h) 입력 : "))
h = float(input("시간(h) 입력 : "))
m = float(input("시간(m) 입력 : "))
d = getDistance(s, h, m)
print(f"{s}(km/h)속도로 {h}(h)시간 {m}(m)분 동안 이동한 거리 : {d}(km)")
print("-" * 50)

🔥 결과 :

--------------------------------------------------
속도(km/h) 입력 : 90
시간(h) 입력 : 2
시간(m) 입력 : 45
90.0(km/h)속도로 2.0(h)시간 45.0(m)분 동안 이동한 거리 : 247.5(km)
--------------------------------------------------


💡 함수 03

비행기 티켓 영수증 출력 함수 만들기

childPrice = 18000
infanPrice = 25000
adultPrice = 50000
specialDc = 50

def formattedNumber(n):       # 1000단위로 ,찍는 함수
    return format(n, ",")     # 여러번 쓰기 때문에 함수로 만들어줌
def printAirPlaneReceipt(c1, c2, i1, i2, a1, a2):

    cp = c1 * childPrice
    cp_dc = int(c2 * childPrice * 0.5)
    print(f"유아 {c1}명 요금 : {formattedNumber(cp)}원")   # 함수에서 format 함수를 호출 할때 ->  format(cp, ',')
    print(f"유아 할인 대상 {c2}명 요금 : {formattedNumber(cp_dc)}원")

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

    ap = a1 * adultPrice
    ap_dc = int(a2 * adultPrice * 0.5)
    print(f"성인 {a1}명 요금 : {formattedNumber(ap)}원")
    print(f"유아 할인 대상 {a2}명 요금 : {formattedNumber(ap_dc)}원")

    print("=" * 50)
    print(f"Total : {c1 + c2 + i1 + i2 + a1 + a2}명")
    print(f"TotalPrice : {formattedNumber(cp + ip+ ap+ cp_dc + ip_dc + ap_dc)}원")
    print("=" * 50)

childCnt = int(input("유아 입력 : "))
dcChildCnt = int(input("할인대상 유아 입력 : "))

infanCnt = int(input("소아 입력 : "))
dcInfanCnt = int(input("할인대상 소아 입력 : "))

adultCnt = int(input("성인 입력 : "))
dcAdultCnt = int(input("할인대상 성인 입력 : "))
print("=" * 50)
printAirPlaneReceipt(childCnt, dcChildCnt, infanCnt, dcInfanCnt,
                              adultCnt, dcAdultCnt)

🔥 결과 :

유아 입력 : 1
할인대상 유아 입력 : 1
소아 입력 : 2
할인대상 소아 입력 : 1
성인 입력 : 2
할인대상 성인 입력 : 0
==================================================
유아 1명 요금 : 18,000원
유아 할인 대상 1명 요금 : 9,000원
소아 2명 요금 : 50,000원
유아 할인 대상 1명 요금 : 12,500원
성인 2명 요금 : 100,000원
유아 할인 대상 0명 요금 : 0==================================================
Total : 7명
TotalPrice : 189,500==================================================


💡 함수 04

재귀함수를 이용해서 팩토리얼 함수 만들기

def formatedNumber(n):          # 1000단위씩 , 적용하는 함수
    return format(n, ",")       # format 쓰는거 까먹지 말자

def recursionFuntion(n):

    if n == 1 :                  # 함수 끝남
        return n

    return n * recursionFuntion(n-1)

inputNumber = int(input("input number : "))
# print(format(recursionFuntion(inputNumber), ','))
print(formatedNumber(recursionFuntion(inputNumber)))

🔥 결과 :

input number : 5
120

단리 / 월복리 계산기 만들기

# 단리
def singRateCalculator(m, t, r):

    totalMoney = 0
    totalRateMoney = 0

    for i in range(t):                       # t(기간 : 년)을 받음
        totalRateMoney += m * (r * 0.01)

    totalMoney = m + totalRateMoney          # m : 원금
    return int(totalMoney)                   # 0.01 때문에 소숫점이 나올 수 있어서 in

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

    t = 12 * t             # 월
    rpm = (r / 12) * 0.01  # 월금리
    totalMoney = m

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

    return int(totalMoney)

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

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


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

🔥 결과 :

예치금() : 10000000
기간() : 3
연 이율(%) : 3

[단리 계산기]
==============================
예치금	 : 10,000,000원
예치기간	 : 3년
연 이율	 : 3%
------------------------------
3년 후 총 수령액 : 10,900,000==============================

[월복리 계산기]
==============================
예치금	 : 10,000,000원
예치기간	 : 3년
연 이율	 : 3%
------------------------------
3년 후 총 수령액 : 10,940,514==============================


💡 함수 05

등차 수열의 n번째 값과 합을 출력하는 함수

# 등차 수열 공식 : an = a1 + (n-1) * d
# 등차 수열 합 공식 : sn = n*(a1 + an) /2


# while 문 = 조건이 참일 경우 계속해서 반복
def sequenceCal(n1, d, n):

# 변수 초기화
    valueN = 0    # N항의 값
    sumN = 0      # N항까지의 값

    i = 1    # while 문 안에서 반복횟수를 계산하는 변수로 초기 값을 1로 설정
             # i는 반복문의 카운터 변수로 반복할 때마다 1씩 증가
    while i <= n :

        if i == 1 :
            valueN = n1
            sumN += valueN
            print(f"{i}번째 항의 값 : {valueN}")
            print(f"{i}번째 항까지의 값 : {sumN}")

            i += 1
            continue

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

        i += 1

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

sequenceCal(inputN1, inputD, inputN)

🔥 결과 :

a1 입력 : 2
공차 입력 : 3
n 입력 : 7
1번째 항의 값 : 2
1번째 항까지의 값 : 2
2번째 항의 값 : 5
2번째 항까지의 값 : 7
3번째 항의 값 : 8
3번째 항까지의 값 : 15
4번째 항의 값 : 11
4번째 항까지의 값 : 26
5번째 항의 값 : 14
5번째 항까지의 값 : 40
6번째 항의 값 : 17
6번째 항까지의 값 : 57
7번째 항의 값 : 20
7번째 항까지의 값 : 77


💡 함수 06

등비 수열의 n번째 값과 합을 출력하는 함수

# 등비 수열(일반항) 공식 : an = a1 * r^(n-1)
# 등비 수열(합) 공식 : sn = a1 * (1-r^n) / (1-r)


def sequenceCal(n1, r, n):

    valueN = 0
    sumN = 0

    i = 1             # 초기화 초기값을 설정하지 않았다면 오류가 발생할 수 있음
    while i <= n:

        if i == 1 :
            valueN = n1
            sumN += valueN
            print(f"{i}번째 항의값 : {valueN}")
            print(f"{i}번째 항까지의값 : {sumN}")

            i += 1  # 무한 루프에 빠지지 않게.
            continue

        valueN *= r                   # i 가 1이 아니라면
        sumN += valueN
        print(f"{i}번째 항의값 : {valueN}")
        print(f"{i}번째 항까지의값 : {sumN}")
        i += 1

inputN1 = int(input("a1 입력 : "))
inputR = int(input("공비 입력 : "))
inputN = int(input("n 입력 : "))

sequenceCal(inputN1, inputR, inputN)

🔥 결과 :

a1 입력 : 2
공비 입력 : 3
n 입력 : 5
1번째 항의값 : 2
1번째 항까지의값 : 2
2번째 항의값 : 6
2번째 항까지의값 : 8
3번째 항의값 : 18
3번째 항까지의값 : 26
4번째 항의값 : 54
4번째 항까지의값 : 80
5번째 항의값 : 162
5번째 항까지의값 : 242


💡 모듈 01

⌨ 모듈

def exampleResult(s1, s2, s3, s4, s5):

    passAvgScore = 60; limitScore = 40

    def getTotal():
        totalScore = s1 + s2 + s3 + s4 + s5
        print(f"총점 : {totalScore}")
        return totalScore

    def getAverage():
        avg = getTotal() / 5
        print(f"평균 : {avg}")
        return avg

    def printPassOrFail():
        print(f"{s1} : 합격") if s1 >= limitScore else print(f"{s1} : 불합격")
        print(f"{s2} : 합격") if s2 >= limitScore else print(f"{s2} : 불합격")
        print(f"{s3} : 합격") if s3 >= limitScore else print(f"{s3} : 불합격")
        print(f"{s4} : 합격") if s4 >= limitScore else print(f"{s4} : 불합격")
        print(f"{s5} : 합격") if s5 >= limitScore else print(f"{s5} : 불합격")

    def printFinalPassOrFail():      # printFinalPassOrFail() 함수가 반환하는 값이 없기 때문에, 이 함수를 호출할 때
                                     # getAverage() 함수가 출력하는 총점 값과 평균 값이 함께 출력됩니다.

        if getAverage() >= passAvgScore:
            if s1 >= limitScore and s2 >= limitScore and s3 >= limitScore and s4 >= limitScore and s5 >= limitScore :
                print("Final Pass!!")

            else :
                print("Final Fail!!")

    getAverage()  # 이 값을 빼는게 결과를 볼 때 더 깔끔할듯
    printPassOrFail()
    printFinalPassOrFail()

문제 :

과목별 점수를 입력하면 합격 여부를 출력하는 모듈을 만들기

(평균 60점 이상 합격, 과락 40점으로 한다.)

import passOrFail as pf

if __name__ == "__main__" :
    sub1 = int(input("과목1 점수 입력 : "))
    sub2 = int(input("과목2 점수 입력 : "))
    sub3 = int(input("과목3 점수 입력 : "))
    sub4 = int(input("과목4 점수 입력 : "))
    sub5 = int(input("과목5 점수 입력 : "))

    pf.exampleResult(sub1, sub2, sub3, sub4, sub5)

🔥 결과 :

과목1 점수 입력 : 100
과목2 점수 입력 : 35
과목3 점수 입력 : 85
과목4 점수 입력 : 45
과목5 점수 입력 : 90
100 : 합격
35 : 불합격
85 : 합격
45 : 합격
90 : 합격
총점 : 355
평균 : 71.0
Final Fail!!


💡모듈 02

⌨ 모듈

def calculatorTotalPrice(gs):

    if len(gs) <= 0 :           # 데이터가 잘 못 들어온 경우
        print("구매 상품이 없습니다.")
        return                  # 끝내기

    rate = 25
    totalPrice = 0

    rates = {1:5, 2:10, 3:15, 4:20}

    if len(gs) in rates:
        rate = rates[len(gs)]

    for g in gs:
        totalPrice += g * (1 - rate * 0.01)

    return [rate, int(totalPrice)]

def formattedNumber(n):
    return format(n, ",")

문제 :

상품 구매 개수에 따라 할인율이 결정되는 모듈을 만들기

import product as pd

if __name__ == "__main__":

    flag = True #flag = False와 같은 코드로 flag 값을 변경하면 반복문이 종료
    gs = []

    while flag :

        selectNumber = int(input("1.구매, 2.종료"))

        if selectNumber == 1 :
            goodsPrice = int(input("상품 가격 입력 : "))
            gs.append(goodsPrice)

        elif selectNumber == 2 :
            result = pd.calculatorTotalPrice(gs)
            flag = False


    print(f"할인율 : {result[0]}%")
    print(f"합계 : {pd.formattedNumber(result[1])}원")

🔥 결과 :

1.구매, 2.종료1
상품 가격 입력 : 500
1.구매, 2.종료1
상품 가격 입력 : 1500
1.구매, 2.종료1
상품 가격 입력 : 2000
1.구매, 2.종료1
상품 가격 입력 : 1500
1.구매, 2.종료1
상품 가격 입력 : 2500
1.구매, 2.종료2
할인율 : 25%
합계 : 6,000


💡 모듈 03

⌨ 모듈

import random

userNums = []
randNums = []
collNums = []   # 숫자가 몇개가 일치하는지
randBonusNum = 0


# 사용자
def setUserNums(ns):           # userNums 에다가 값을 넣어주는 함수
    global userNums
    userNums = ns

def getUserNums():             # 사용자가 입력한 것을 빼오는 함수
    return userNums

# 기계
def setRandNums():
    global  randNums
    randNums = random.sample(range(1, 46), 6)    # 여기서 빼오면 된다.

def getRandNums():
    return randNums

# 보너스
def setBounsNums():
    global randBonusNum

    while True :     # 위에 setRandNums 와 번호가 겹치면 안되기 때문에 겹치지 않을때까지 돌려야함
        randBonusNum = random.randint(1, 45)
        if randBonusNum not in randNums :
            break

def getBounsNum():
    return randBonusNum

# 로또 결과 반환
def lottoResult():
    global userNums              # global = 전역변수 참조
    global randNums
    global collNums

    collNums = []                # 과거의 데이터가 있으면 안되니까 초기화
    for un in userNums :
        if un in randNums :      # 숫자가 일치하면
            collNums.append(un)

    if len(collNums) == 6 :     # 맞네! 일치한 번호만 들어오니까 6개면 당첨
        print("1등 당첨!")
        print(f"번호 : {collNums}")

    elif (len(collNums) == 5) and (randNums in userNums) :
         print("2등 당첨!")
         print(f"번호 : {collNums}, 보너스 번호 : {randBonusNum}")

    elif len(collNums) == 5 :
        print("3등 당첨!")
        print(f"번호 : {collNums}")

    elif len(collNums) == 4 :
        print("4등 당첨!")
        print(f"번호 : {collNums}")

    elif len(collNums) == 3 :
        print("5등 당첨!")
        print(f"번호 : {collNums}")

    else :
        print("당첨되지 않았습니다.")
        print(f"당첨 번호 : {randNums}\t보너스 번호 : {randBonusNum}")
        print(f"내 번호 : {userNums}")
        print(f"일치 번호 : {collNums}")

def startLotto():
    n1 = int(input("번호(1~45)를 입력하세요 : "))
    n2 = int(input("번호(1~45)를 입력하세요 : "))
    n3 = int(input("번호(1~45)를 입력하세요 : "))
    n4 = int(input("번호(1~45)를 입력하세요 : "))
    n5 = int(input("번호(1~45)를 입력하세요 : "))
    n6 = int(input("번호(1~45)를 입력하세요 : "))
    selectNums = [n1, n2, n3, n4, n5, n6]

    setUserNums(selectNums)
    setRandNums()
    setBounsNums()
    lottoResult()

문제 :

로또 모듈을 만들고 로또 결과가 출력될 수 있도록 프로그램 만들기

import lotto as lt

lt.startLotto()

🔥 결과 :

번호(1~45)를 입력하세요 : 7
번호(1~45)를 입력하세요 : 28
번호(1~45)를 입력하세요 : 4
번호(1~45)를 입력하세요 : 15
번호(1~45)를 입력하세요 : 3
번호(1~45)를 입력하세요 : 21
5등 당첨!
번호 : [7, 28, 3]
번호(1~45)를 입력하세요 : 7
번호(1~45)를 입력하세요 : 28
번호(1~45)를 입력하세요 : 4
번호(1~45)를 입력하세요 : 15
번호(1~45)를 입력하세요 : 03
번호(1~45)를 입력하세요 : 21
당첨되지 않았습니다.
당첨 번호 : [21, 16, 24, 25, 30, 1]	보너스 번호 : 18
내 번호 : [7, 28, 4, 15, 3, 21]
일치 번호 : [21]


💡 모듈 04

⌨ 모듈

def getPermutationCnt(n, r):

     result =1
     for n in range(n, (n-r), -1):
         print("n:{}".format(n))
         result = result * n


     return result

# 순열을 계산해 주는 모듈

from itertools import permutations

def getPermutations(ns, r):

    pList = list(permutations(ns, r))
    print(f"{len(ns)}P{r} 개수 : {len(pList)}")

    for n in permutations(ns, r) :
        print(n, end="")

문제 :

순열 계산 모듈 프로그램 만들기

# 7P5  -> 7까지 경우중 5개를 순서에 맞게 뽑아냄

import permutation as pt

numN = int(input("numN 입력 : "))
numR = int(input("numR 입력 : "))

print(f"{numN}P{numR} : {pt.getPermutationCnt(numN, numR)}")

# 경우의 수를 나열해서 보여줌

listVar = [1, 2, 3, 4, 5, 6, 7, 8]
rVar = 3
pt. getPermutations(listVar, rVar)

🔥 결과 :

numN 입력 : 7
numR 입력 : 5
n:7
n:6
n:5
n:4
n:3
7P5 : 2520
8P3 개수 : 336
(1, 2, 3)(1, 2, 4)(1, 2, 5)(1, 2, 6)(1, 2, 7)(1, 2, 8)(1, 3, 2)(1, 3, 4) ···


💡 모듈 06

⌨ 모듈

income = 0
waterPrice = 0
gasPrice = 0
electPrice = 0

def setIncome(ic):      # 설정하는 함수
    global income
    income = ic

def getIncome():         # 데이터를 가져오는 함수
    return income


def setWaterPrice(wc):
    global waterPrice
    waterPrice = wc

def getWaterPrice():
    return waterPrice


def setGasPrice(gc):
    global gasPrice
    gasPrice = gc

def getGasPrice():
    return gasPrice


def setElectPrice(ec):
    global electPrice
    electPrice = ec

def getElectPrice():
    return electPrice


def getUtilityBill():
    result = waterPrice + gasPrice + electPrice
    return result

def getUtilityBillrate():
    result = getUtilityBill() / getIncome() * 100
    return result

문제 :

수입과 공과금을 입력하면 공과금 총액과 수입 대비 공과금 비율을 계산하는 모듈 만들기

import utilily


income = int(input("수입 입력 : "))
utilily.setIncome(income)

waterPrice = int(input("수도요금 입력 : "))
utilily.setWaterPrice(waterPrice)

electPrice = int(input("전기요금 입력 : "))
utilily.setElectPrice(electPrice)

gasPrice = int(input("가스요금 입력 : "))
utilily.setGasPrice(gasPrice)

print(f"공과금 : {utilily.getUtilityBill():,.0f}원")
print(f"공과금 비율 : {utilily.getUtilityBillrate()}%")

🔥 결과 :

수입 입력 : 3000000
수도요금 입력 : 15000
전기요금 입력 : 17500
가스요금 입력 : 125000
공과금 : 157,500원
공과금 비율 : 5.25%


profile
keep going

0개의 댓글