Python[2주차-3일] (중급 문제풀이1~3)

이동일·2023년 7월 15일

Python

목록 보기
7/10
post-thumbnail

문제풀이 1

함수문제1~2(함수1)

  • 다음과 같이 출력 될 수 있도록 산술연산 계산기를 함수를 이용해서 만들어 보자
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 flo(n1, n2):
    return n1//n2


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

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







while True:
    print('-'*60)
    selectNum = int(input('1.덧셈, 2.뺄셈, 3.곱셈, 4.나눗셈, 5.나머지, 6.몫, 7.제곱승, 8.종류'))
    if selectNum ==8:
        print('Bye~')
        break

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

    if selectNum ==1:
        print(f'{num1} + {num2} = {add(num1,num2)}')

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

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

    elif selectNum ==4:
        print(f'{num1} 4/ {num2} = {div(num1,num2)}')

    elif selectNum ==5:
        print(f'{num1} % {num2} = {mod(num1,num2)}')

    elif selectNum ==6:
        print(f'{num1} // {num2} = {flo(num1,num2)}')

    elif selectNum ==7:
        print(f'{num1} ** {num2} = {exp(num1,num2)}')
        
        
    else:
        print('잘못 입력')
        

코드 해설

  • 함수로 연산자들을 반환 해서
  • add(num1,num2)와 같이 함수를 호출하여 각각의 연산에 따라 해당하는 함수를 호출하고 숫자를 계산하여 결과를 출력한다.

함수문제 1~2(함수2)

# 거리(km) = 속도(km) * 시간(h)

def getDistance(speed, hour, minute):
    distance = speed * (hour + minute /60) #60으로 나누어야 '분'을 구할수 있다.
                       #45 / 60 = 0.75 --> 2시간+ 0.75분 = 2.75
                       #스피드 90 * 2.75



    return distance



#시간 구하는 함수 만들기
# 100:75 = 60:x --> x = 75 * 60 / 100
def getTime(speed, distance):
    time = distance / speed
    print(f'time :{time}')
    h= int(time)
    m =  (time - h) * 100 *60 / 100 # 0.75 * 100

    return [h, m]


print('-' * 60)
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('-' * 60)

        

코드요약

  • getDistance(speed,hour,minute)함수는
    속도 시간을 입력받아 거리를 계산하여 반환하는 함수
  • getTime(speed,distance) 함수는 속도와 거리를 입력받아 소요시간을 계산
  • d = getDistance(s, h, m) 여기서 s,h,m은
    함수의 매개변수(speed, hour, minute)를 의미한다.!

함수문제1~2(함수3)

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

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

def printAirPlaneReceipt(c1, c2, i1, i2, a1, a2):

    cp = c1 * childPrice# 어린이할인
    cp_dc = int(c2 * childPrice * 0.5) #50%할인 위한 0.5
    print(f'유아{c1}명 요금 {formatedNumber(cp)}원')
    print(f'유아 할인 대상{c2}명 요금 {formatedNumber(cp_dc)}원')


    ip = i1 * infantPrice #만12세 미만 할인
    ip_dc = int(i2 * infantPrice *0.5)
    print(f'소아{i1}명 요금 {formatedNumber(ip)}원')
    print(f'소아 할인 대상{i2}명 요금 {formatedNumber(ip_dc)}원')



    ap = a1 * adultPrice #성인 할인
    ap_dc = int(a2 * adultPrice * 0.5)
    print(f'성인{a1}명 요금 {formatedNumber(ap)}원')
    print(f'성인 할인 대상{a2}명 요금 {formatedNumber(ap_dc)}원')


    print(f'Total: {c1 + c2 + i1 + i2 + a1 + a2}명')
    print(f'TotalPrice: {formatedNumber(cp + cp_dc + ip + ip_dc+ap+ap_dc)}원')


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


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


adultCnt = int(input('성인 입력: '))
specialDCAdultCnt = int(input('할인 대상 성인 입력:'))

printAirPlaneReceipt(childCnt, specialDCChildCnt,
                    infantCnt, specialDCInfantCnt,
                    adultCnt, specialDCAdultCnt)
        

코드 요약

  • 먼저 항공영수증 함수에 매개변수를 만든다.
    c1,c2,i1,i2,a1,a2 는 각각 유아,소아,성인 을 의미한다.

함수문제1~2(함수4)

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

def recursionFun(n):


    if n ==1:
        return n

    return n * recursionFun(n-1)

inputNumber = int(input('input number:'))
print(formatedNumber(recursionFun(inputNumber)))
        

코드요약

  • 팩토리얼 계산 위한 recursionFun()함수이다.
  • n이 1면 1반환하고 1이 아니면 recursionFun(n-1)의 곱을 반환한다.
  • 입력에 5를 넣으면 120출력(5x4x3x2x1)

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


def multiRateCalculator(m, t, r): #예치금(m), 기간(t), 연 이율(r) 월복리로 계산된 총 수령액을 반환 하는 함수

    t = t * 12 # 입력된 기간을 월로 환산하여 변수 t에 할당
    rpm = (r/12) *0.01 #연 이자율을 월 이자율로 변환

    totalMoney = m #초기 수령액 초기화

    for i in range(t): #월 복리 계산 부분 기간(t)만큼 반복한다. 매월마다 총 수령액에 이자추가
        totalMoney = totalMoney + (totalMoney * rpm)#rpm 월 이자율

    return int(totalMoney)



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


print('[단리 계산기]')
print(f'{term}년 후 총 수령액: {formatedNumber(multiRateCalculator(money , term, rate))}')




print('[월복리 계산기')
print(f'{term}년 후 총 수령액: {formatedNumber(multiRateCalculator(money,
        

함수문제1~2(함수5)

#등차 수열 공식: an= a1 + (n-1) * d
#등차 수열 합 공식: sn = n*(a1 + an)/ 2
def sequenceCal(n1, d, n):# 등차 수열의 각 항의 값을 계산하고, 합을 출력하는 함수
                        #n1 첫번째 항, d공차, n항의 갯수

    valueN = 0; sumN = 0; # 등차 수열의 항의 값을 저장하는 변수와 합을 저장하는 변수

    i = 1 #반복문 제어
    while i <=n:

        if i ==1: # 첫 번째 항인 경우 처리하는 조건문
            valueN = n1 #첫 항을 n1설정
            sumN += n1 #합계산하기위해 n1 더한다.
            sumN += valueN
            print(f'{1}번째 항의 값: {valueN}')
            print(f'{1}번째 항의 합: {sumN}')

            i +=1 #다음 항으로 넘어간다.
            continue
        valueN += d
        sumN += valueN
        print(f'{i}번째 항의 값: {valueN}')
        print(f'{i}번째 항까지의 합:{sumN}')

        i += 1

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

sequenceCal(inputN1, inputD, inputN)
        

함수문제1~2(함수6)

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
        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)


        

함수문제1~2(모듈1)


def exampleResult(s1, s2, s3, s4, s5):#s1~s5 매개변수는 과목1~과목5 를 의미한다.

    passAvgScore = 60; limitScore = 40 #60이상 합격, 과락 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(): #합격,불합격(과락) 여부 함수
                            # s1~s5가 limitScore(40점이상이면 합격 아니면 불합격Fail)
        print(f'{s1}: Pass') if s1 >=limitScore else print(f'{s1}: Fail')
        print(f'{s2}: Pass') if s2 >=limitScore else print(f'{s2}: Fail')
        print(f'{s3}: Pass') if s3 >=limitScore else print(f'{s3}: Fail')
        print(f'{s4}: Pass') if s4 >=limitScore else print(f'{s4}: Fail')
        print(f'{s5}: Pass') if s5 >=limitScore else print(f'{s5}: Fail')

    def printFinalPassOrFail():

        if getAverage() >= passAvgScore: #평균함수가  passAvgScore60점 보다 크면 최종합격 .or 최종 탈락
            if s1 >= limitScore and s2 >= limitScore and s3 >= limitScore and s4 >= limitScore and s5 >= limitScore:
                print('Final Pass!')
            else:
                print('Final Fail')

        else:
            print('Final Fail!')

    getAverage() #과목들의 평균을  출력
    printPassOrFail() #과목 점수가 40점 이상인지 확인
    printFinalPassOrFail() #최종 합격 불학격 여부 확인

        
        
   
   
   
 ##########################################
 import ex as e

if __name__ =='__main__':
    #현재 파일이 직접 실행되는 경우에만 아래 코드 실행된다.
    sub1 = int(input('과목1 점수 입력:'))
    sub2 = int(input('과목2 점수 입력:'))
    sub3 = int(input('과목3 점수 입력:'))
    sub4 = int(input('과목4 점수 입력:'))
    sub5 = int(input('과목5 점수 입력:'))

    #출력을 위해 기존매개변수 s1,s2,s3,s4,s5를 sub1~5로 바꾸었다.
    e.exampleResult(sub1, sub2, sub3, sub4, sub5)
        
        

함수문제1~2(모듈2)


def calculatorTotalPrice(gs):#가격을받아서(gs) 할인율을 적용한 토탈 구매 가격 계산 함수


    if len(gs) <= 0: #입력된 상품가격이 0이하인 경우 상품 유무 체크
        print('구매 상품이 없습니다.')
        return

    rate = 25 #비율(할인율) 25로 초기화(기본값)
    totalPrice = 0 #총 구매가격 저장 변수

    rates= {1:5, 2:10, 3:15 , 4:20} #1개면5%, 2개면10%할인!

    if len(gs) in rates:#상품 개수가 rates에 포함되면 상품에 맞는 할일율 적용
        rate = rates[len(gs)]

    for g in gs: #상품 가격(gs)의 각 상품 가격에 대해 반복문 실행
                #g는 for문을 통한 한개씩 가져온 상품 가격을 의미
        totalPrice += g *(1- rate * 0.01)#각각의 상품가격(g)에 할인율 적용한 가격을 계산하여 총구매 가격에 더한다.

                                        #20% 할인이면 (1-20*0.01) --> (1- 0.20) -> 0.8
                                        #


    return [rate, int(totalPrice)] #할인율과, total 







###################################################



import discount as dc

if __name__=='__main__':

    flag = True
    gs = []

    while flag:

        selectNumber = int(input('1.구매, 2. 종료'))
        if selectNumber == 1:
            goods_price = int(input('상품 가격 입력:'))
            gs.append(goods_price)#gs리스트에 상품가격을 추가

        elif selectNumber ==2:
            result = dc.calculatorTotalPrice(gs)
            flag =False #False로 반복 조건문 탈출


	 #return [rate, int(totalPrice)] 으로 반환되어서
    # 리스트에 의해서 [rate,int(totalPrice)]
    #즉 리스트에서 0번 rate, 1번 int(totalPrice)를 의미한다.
    print(f'할인율:{result[0]}%')
    print(f'합계:{result[1]}원')
        

함수문제1~2(모듈3)



import random

userNums = []; randNums = []; collNums = []
#유저번호, 기계 생성 번호, 중복된 번호를 저장하기위한 리스트
randBonuNum = 0


def setUserNums(ns): #사용자가 입력한 번호ns 반환
    global userNums
    userNums = ns




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


def setRandNums():#기계가 빼오는 번호
    global randNums
    #global 는 변수를 전역 변수로 선언하는 데 사용(코드 전체에서 공유되는 변수)
    randNums = random.sample(range(1, 46),6)
    #random.smple()함수를 사용하여 1부터 45 사이의 범위에서
    #중복되지 않는 6개의 난수 생성


def getRandNums(): #기계가 생성한 번호를 반환하는 함수
    return randNums





def setBonuNum(): #보너스는 위에서 발생한 난수랑 겹치면 안됨
    global randBonuNum

    while True: #겹치지 않을때가지 번호 생성
        randBonuNum = random.randint(1, 45)
        if randBonuNum not in randNums:
            break

def getBonuNum():
    return randBonuNum

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:
        print('1등 당첨!')
        print(f'번호: {collNums}')

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

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



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


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


    else:
        print('꽝!!!!!!!!!!!!!!')
        print(f'기계 번호: {randNums}')
        print(f'보너스 번호: {randBonuNum}')
        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()
    setBonuNum()

    lottoResult()



#**********************
import lotto as lt


lt.startLotto()
        

함수문제1~2(모듈4)


#n: 전체 집합 크기
#r선택할 요소 개수
def getPermutationCnt(n, r, logPrint = True): #매개변수 n,r을 사용하여 조합의 개수 계산


    result = 1
    for n in range(n, (n-r), -1):#n부터 (n-r)까지 역순으로 반복한다.
        if logPrint : print('n:{}'.format(n))#logPriint가 True이면 실행
        result = result * n

    return result

from itertools import permutations

def getPermutations(ns, r):#ns에서 길이r인 순열 생성후 순열의 개수와 순열을 출력하는 함수
    pList = list(permutations(ns, r))#순열을 리스트로 변환하여 변수 pList에 할당
    print(f'{len(ns)}P{r} 개수: {len(pList)}')#len(pList)는 생성된 순열의 개수를 나타낸다.

    for n in permutations(ns, r):#permutation함수를 사용하여 원소 리스트 ns에서 길이가 r인 수열을 생성하며 반복문 실행
        print(n, end='')
        
        
        
        
    
#############################
import permutation as pt

# numN = int(input('numN 입력: '))
# numR = int(input('numR 입력: '))


# print(f'{numN}P{numR}: {pt.getPermutationCn#t(numN, numR, logPrint=False)}')

listVar = [1,2,3,4,5,6,7,8] #순열 생성
rVar =3 #순열의 길이 3개씩 출력이 된다.
pt.getPermutations(listVar, rVar)


        

함수문제1~2(모듈5)


def getCombinationCnt(n, r):#조합의 개수를 계산하는 함수

    #계산 결과를 저장하는데 사용
    resultP = 1
    resultR = 1
    resultC = 1

    for n in range(n, (n-r), -1 ):#n부터 n-r까지 정수들을 순회
        resultP = resultP * n #n개중에서 r개를 선택한 순열의 개수 저장

    for n in range(r, 0, -1):
        resultR = resultR * n  #rsultR 팩토리얼 값

    resultC = int(resultP / resultR) #resultP값과 resultR 값의 비율 계산

    return resultC




####################
import combination as ct


numN = int(input('numN 입력'))
numR = int(input('numR 입력'))


print(f'{numN}C{numR}: {ct.getCombinationCnt(numN, numR)}')
        

함수문제1~2(모듈6)

income = 0
waterPrice = 0; electricPrice = 0; gasPrice = 0


def setIncome(ic):#외부에서 전달된 ic 값을 수입 변수 income에 저장
    global income
    income = ic

def getIncome(): ## 수입 변수 incom의 값을 외부로 반환(이 함수로 외부에서 수입 값 가져온다.)
    return income


#수도세
def setWaterPrice(wp):# 수도세 변수
    global waterPrice# waterPrice를 외부로 반환(외부에서 수도세 값을 가져올 수 있다.)
    waterPrice = wp

def getWaterPrice():
    return waterPrice


#전기요금
def setElectricPrice(ep):
    global electricPrice#외부에서 전달된 ep값을 전기요금 electricPrice에 할당
    electricPrice = ep

def getElectricPrice():
    return electricPrice #electricPrice를 외부로 반환(전기요금 가져올 수 있다.)


#가스
def setGasPrice(gp):#외부에서 잔달된 gp값을 gasPrice에 저장
    global gasPrice
    gasPrice = gp

def getGasPrice():# 가스 값 외부로 반환
    return gasPrice


def getUtilityBill():#모든 공과금 더한다.(공과금 총액)
    result = waterPrice + electricPrice + gasPrice
    return result

def getUilityBillRate():#전체수익에서 차지하는 공과금
    result = getUtilityBill() / getIncome() * 100
    return result
#백분율 표현 위해 *100 수행
#getUtilityBill 모든 공과금 총액을 반환
#getIncome 수입을 반환






############
실행
import utilityBill as ub

inputIncome= int(input('수입 입력:'))
ub.setIncome(inputIncome)#수# 입세팅

inputWaterPrice = int(input('수도요금 입력:'))
ub.setWaterPrice(inputWaterPrice)

inputElectricPrice = int(input('전기요금 입력: '))
ub.setElectricPrice(inputElectricPrice)


inputGasPrice = int(input('가스요금 입력: '))
ub.setGasPrice(inputGasPrice)

print(f'공과금: {ub.getUtilityBill()}원')
print(f'수입 대비 공과금 비율: {ub.getUilityBillRate()}')



        

후기:
12일 공부를 3일만에 올렸다. 수열같은 문제는 어렵고 이해가 안간다.
함수와 클래스를 쓰니 코드가 어려워졌다.
따라 치고 코드를 분석하고 이해 할려고 하지만 전부다 이해 하진 못했다.
머리가 조금 아프다!!.. 꾸준히 매일 매일 조금이라도 하자

0개의 댓글