02-02. 파이썬 기초 문제풀이

탄팥빵·2021년 10월 12일

Python

목록 보기
3/8

02-02. 파이썬 기초 문제풀이


데이터와 변수

# '주문확인서' 템플릿으로 만들고,
# 변경되는 정보만 입력하면 '주문확인서'가 완성 될 수 있도록
# 프로그램을 만들어 보자

name = '홍길동'
product = '야구글러브'
orderNo= 2568956
payMethod = '신용카드'
productPrice = 110000
payPrice = 100000
usePoint = 10000
payDate = '2021/08/03 21:50:12'
payDiv = 6
payDivCategory = '무'
phone = '02-1234-5678'

print(name, '고객님 안녕하세요.')
print(name, '고객님의 주문이 완료되었습니다.')
print('다음은 주문건에 대한 상세 내역입니다.')
print('-'*50)
print('상품명\t: ', product)
print('주문번호\t: ', orderNo)
print('결제방법\t: ', payMethod)
print('상품금액\t: ', productPrice)
print('결제금액\t: ', payPrice)
print('포인트\t: ', usePoint)
print('결제일시\t: ', payDate)
print('할부\t: ', payDiv)
print('할부유형\t: ', payDivCategory)
print('문의\t: ', phone)
print('-'*50)
print('저희 사이트를 이용해 주셔서 감사합니다.')


# 사용자가 입력한 데이터의 길이를 출력하는 프로그램 만들어 보자
# len(): 문자 길이를 반환함

userMsg = input('메세지 입력: ')
print('메세지 길이: {}'.format(len(userMsg)))


# 다음 문장에서 '객체지향' 문자열을 찾아 보자
'''
파이썬[3](영어: Python)은 1991년[4] 프로그래머인 귀도 반 로섬[5]이 발표한 고급 프로그래밍 언어로, 
플랫폼에 독립적이며 인터프리터식, 객체지향적, 동적 타이핑(dynamically typed) 대화형 언어이다.
파이썬이라는 이름은 귀도가 좋아하는 코미디 〈Monty Python's Flying Circus〉에서 따온 것이다.
'''
# find() : 특정 문자열의 위치를 찾아 반환홤

article = "파이썬[3](영어: Python)1991[4] 프로그래머인 귀도 반 로섬[5]이 발표한 고급 프로그래밍 언어로, \
플랫폼에 독립적이며 인터프리터식, 객체지향적, 동적 타이핑(dynamically typed) 대화형 언어이다. \
파이썬이라는 이름은 귀도가 좋아하는 코미디 〈Monty Python's Flying Circus〉에서 따온 것이다."

strIdx = article.find('객체지향적') # '객체지향적'의 위치를 index로 반환
print("'객체지향' 문자열 위치: {}".format(strIdx))


# 사용자가 입력한 데이터를 모두 실수로 변경한 후 사각형, 삼각형의 넓이를 출력해보자.

width = float(input('가로 길이 입력: '))
height = float(input('세로 길이 입력: '))

triangleArea = width * height / 2
squareArea = width * height

print('-'*25)
print('삼각형 넓이 : %.2f' % triangleArea) # 소수점을 컨트롤하고 싶다면 형식문자 사용
print('사각형 넓이 : %.2f' % squareArea)
print('-'*25)


# 원의 반지름을 입력하면 원의 넓이와 둘레 길이를 출력하되,
# 아래와 같은 형식으로 출력해보자.
# 정수, 소수점 한자리, 소수점 셋째자리

pi = 3.14
radius = float(input('반지름(cm) 입력: '))

circleArea = pi * radius * radius
circleLength = 2 * pi * radius

# 정수 형식으로 출력
print('원의 넓이\t: %d' % circleArea)
print('원의 둘레길이\t: %d' % circleLength)

# 소수점 한자리 형식으로 출력
print('원의 넓이\t: %.1f' % circleArea)
print('원의 둘레길이\t: %.1f' % circleLength)

# 소수점 세째자리 형식으로 출력
print('원의 넓이\t: %.3f' % circleArea)
print('원의 둘레길이\t: %.3f' % circleLength)


# 사용자로부터 입력받은 개인정보를 포맷문자열을 이용해서 출력해보자.
# (단, 비밀번호와 주민번호 뒷자리는 별표로 처리)
# len(): 문자 길이 반환
# str[0]: str에 저장된 문자열에서 첫 번째 문자를 반환

name = input('이름 입력: ')
mail = input('메일 입력: ')
account_id = input('아이디 입력: ')
pw = input('비밀번호 입력: ')
ss_num1 = input('주민번호 앞자리 입력: ')
ss_num2 = input('주민번호 뒷자리 입력: ')
address = input('주소 입력: ')

print('-'*30)
print(f'이름\t: {name}')
print(f'메일\t: {mail}')
print(f'아이디\t: {account_id}')
pw_hidden = '*' * len(pw)
print(f'비밀번호\t: {pw_hidden}')
ss_num_hidden = ss_num2[0] + ('*'*6) # 주민번호 뒷자리는 첫 번호 외엔 *로 표시
print(f'주민번호 : {ss_num1} - {ss_num_hidden}')
print(f'메일 : {address}')
print('-'*30)


# 체중(g)과 신장(cm)을 입력하면 BMI지수가 출력되는 프로그램을 만들어 보자.
# BMI = 몸무게(kg) / (신장(m) * 신장(m))
# isdigit(): 숫자인지 확ㅇ니(숫자이면 True, 아니면 False)

w = input('체중 입력(kg): ')
h = input('신장 입력(cm): ')

if w.isdigit(): # 숫자가 맞다면
    w = int(w)
    
if h.isdigit():
    h = int(h) / 100

print('체중 : {}kg'.format(w))
print('신장 : {}m'.format(h))

bmi = w / (h * h)
print('BMI : %f' % bmi)


# 다음 코드에서 num1과 nu2의 값이 서로 바뀌어 각각 출력되게 해 보자.
'''
num1 = 10
num2 = 20
'''

num1 = 10
num2 = 20
print('num1: {}, num2: {}'.format(num1, num2))

tempNum = num1
num1 = num2
num2 = tempNum
print('num1: {}, num2: {}'.format(num1, num2))


# 중간, 기말고사 점수를 입력하면 총점과 평균이 출력되는 프로그램을 만들어 보자.
# (잘못 입력하면, 오류 표시)

score1 = input('중간고사 점수: ')
score2 = input('기말고사 점수: ')

if score1.isdigit() and score2.isdigit(): # 숫자가 아니면 형변환 때 에러가 나기 때문에 사전에 체큭해 주는 것
    score1 = int(score1)
    socre2 = int(score2)
    
    total_score = score1 + socre2
    avg_score = total_score / 2
    
    print('총점: {}, 평균: {}'.format(total_score, avg_score))
    
else:
    print('점수 잘못 입력 됨')


# 키오스크에서 사용하는 언어 선택 프로그램을 만들어보자.

select_num = input('언어 선택(Choose your language): 1. 한국어\t2. English')

if int(select_num) == 1: # 한국어라면
    menu = '1 샌드위치 \t 2. 햄버거 \t 3. 쥬스 \t 4. 커피 \t 5. 아이스크림'
    
elif int(select_num) == 2:
    menu = '1 Sandwich \t 2. Burger \t 3. Juice \t 4. Coffee \t 5. Icecream'
     
print(menu)


# 나의 나이가 100살 되는 해의 연도를 구하는 프로그램을 만들어보자.
# 나이 입력

import datetime

today = datetime.datetime.today()

myAge = input('나이 입력: ')
if myAge.isdigit():
    years_left = 100 - int(myAge)
    date_of_100 = today.year + years_left
    print('{}년 -- {}년 후에 100살!'.format(date_of_100, years_left))
    
else:
    print('나이를 잘못 입력하였습니다.')


연산자

# 상품 가격과 지불 금액을 입력하면 거스름 돈을 계산하는 프로그램을 만들어 보자.
# 단, 거스름 돈은 지폐와 동전의 개수를 최소로 하고, 1언 단위 절사한다

# 금액별 변수 선언
money50000 = 50000; money10000 = 10000; money5000 = 5000; money1000 = 1000; money500 = 500; money100 = 100; money10 = 10
# 금액별 몇 개인지 count하기 위한 변수 선언
money50000Cnt = 0; money10000Cnt = 0; money5000Cnt = 0; money1000Cnt = 0; money500Cnt = 0; money100Cnt = 0; money10Cnt = 0 

productPrice = int(input('상품 가격 입력: '))
payPrice = int(input('지불 금액: '))

if payPrice > productPrice : # 지불 금액이 상품 가격보다 많다면
    changeMoney = payPrice - productPrice # 지불 가격에서 상품 가격을 빼 거슬러줘야 할 잔돈 계산
    changeMoney = (changeMoney // 10) * 10 # 잔돈을 10으로 나눈 나머지를 구하면 1원 단위는 떨어져 나가겠다; 이어서 10을 다시 곱해야 원래 단위에 맞게 된다
    print('거스름돈: ', changeMoney)

# 잔돈으로 거슬러 줘야 할 5만원 개수 구하기
if changeMoney > money50000: # 만약 거슬러줘야 할 돈이 5만원 보다 크다면
    money50000Cnt = changeMoney // money50000 # 잔돈을 5만원으로 나누어 몫을 구하면 거스름돈에 사용할 5만원짜리 개수가 된다
    # changeMoney = changeMoney % money50000 
    changeMoney %= money50000 # 잔돈을 5만원으로 나눈 나머지가 남은 거슬러줘야 할 잔돈이 되겠다
    # 이렇게 남은 잔돈으로 이어서 동일한 로직으로 다른 단위 지폐는 각 얼마나 필요한지 구해가면 된다
# 1만원 개수 구하기
if changeMoney > money10000:
    money10000Cnt = changeMoney // money10000
    changeMoney %= money10000
# 5천원 개수 구하기
if changeMoney > money5000:
    money5000Cnt = changeMoney // money5000
    changeMoney %= money5000
# 1천원 개수 구하기
if changeMoney > money1000:
    money1000Cnt = changeMoney // money1000
    changeMoney %= money1000
# 500원 개수 구하기
if changeMoney > money500:
    money500Cnt = changeMoney // money500
    changeMoney %= money500
# 100원 개수 구하기
if changeMoney > money100:
    money100Cnt = changeMoney // money100
    changeMoney %= money100
# 10원 개수 구하기
if changeMoney > money10:
    money10Cnt = changeMoney // money10
    changeMoney %= money10

print('-'*30)
print('5만원 {}장'.format(money50000Cnt))
print('1만원 {}장'.format(money10000Cnt))
print('5천원 {}장'.format(money5000Cnt))
print('1천원 {}장'.format(money1000Cnt))
print('500원 {}장'.format(money500Cnt))
print('100원 {}장'.format(money100Cnt))
print('10원 {}장'.format(money10Cnt))
print('-'*30)


# 국어, 영어, 수학 점수 입력 후 총점, 평균, 최고점수 괌고, 최저점수 과목, 그리고 최고 점수와 최저 점수의 차이를 각각 출력해보자.

korScore = int(input('국어 점수 입력: '))
engScore = int(input('영어 점수 입력: '))
mathScore = int(input('수학 점수 입력: '))

# 총점 및 평균 구하기
totalScore = korScore + engScore + mathScore
avgScore = totalScore / 3

# 최고점수 과목 구하기
# 일단 국어를 최고 점수로 가정을 하고, maxScore/maxSubject에 할당하자
maxScore = korScore
maxSubject = '국어'
# 만약 영어 점수가 국어점수보다 크면 maxScore 과목을 변경해준다
if engScore > maxScore: 
    maxScore = engScore
    maxSubejct = '영어'
    # 만약 영어 점수가 국어점수보다 크지 않다면 이 조건문은 실행되지 않을 테니, maxScore는 여전히 국어일 것이다.
# 수학에 대해서도 동일한 로직을 적용하자
if mathScore > maxScore: 
    maxScore = mathScore
    maxSubject = '수학'

# 최저점수 과목 구하기
# 이것도 최고점수 과목 구한 로직과 동일하게 일단 국어를 최저점수 과목으로 할당하고 비교해 가자.
minScore = korScore
minSubject = '국어'

if engScore < minScore:
    minScore = engScore
    minSubject = '영어'

if mathScore < minScore:
    minScore = mathScore
    minSubject = '수학'

# 최고점수와 최저점수 차이 구하기
difScore = maxScore - minScore

print('총점: {}'.format(totalScore))
print('평균: %.2f' % avgScore)
print('*'*30)
print('최고점수 과목(점수): {}({})'.format(maxScore, maxSubject))
print('최저점수 과목(점수): {}({})'.format(minScore, minSubject))
print('최고-최저 차이: {}'.format(difScore))
print('*'*30)


# 시, 분, 초를 입력하면 초로 환산하는 프로그램을 만들어보자.

hou = int(input('시간 입력: '))
min = int(input('분 입력: '))
sec = int(input('초 입력: '))

# 초로 환산
total_sec = hou * 60 * 60 + min * 60 + sec
print('{}초'.format(format(total_sec, ','))) #1000단위 구분을 위해 format() 함수 사용; ',': ,로 구분자를 하겠다라는 
    # format()을 사용한 결과는 더 이상 숫자가 아닌 문자이다


# 금액, 이율 ,거치기간을 입력하면 복리계산 하는 복리계산기 프로그램을 만들어보자.

money = int(input('금액 입력: ')) # 원금
rate = float(input('이율 입력: ')) # 이율; 보통 실수 e.g. 4.3%
term = int(input('기간 입력: ')) # 거치기간

targetMoney = money # 기간이 다 지났을 때 내가 받을 돈을 targetMoney으로 할당

for i in range(term): # 입력한 기간(연) 만큼 횟수로 반복
    # targetMoney = targetMoney + (targetMoney * rate = 0.01) 
    targetMoney += (targetMoney * rate * 0.01) # 이자; 1년이 지났을 때의 이자를 기존에 있던 돈에 더한 것

targetMoneyFormatted = format(int(targetMoney), ',') # 소수점까지 안 나오도록 int()로 변형하고, 1000단위 끊어서 표시
    
print('-'*30)
print('이율: {}'.format(rate))
print('원금: {}'.format(format(money, ','))) # 여기도 1000단위 구분
print('{}년 후 금액: {}원'.format(term, targetMoneyFormatted))
print('-'*30)


# 고도가 60m 올라갈 때마다 기온이 0.8도 내려간다고 할 때 고도를 입력하면 기온이 출력되는 프로그램을 만들어 보자.(지면온도: 29도)

baseTemp = 29 #지면온도
step = 60 #60m 올라갈 때마다 => 1단계 올라갈 때마다
stepTemp = 0.8 #내려가는 기온

height = int(input('고도 입력:'))

targetTemp = baseTemp - (height // step * 0.8) # 몇 단계 올라갔는지를 몫을 구하는 연산자 사용(//)해서 구하고, 그 몫에 0.8도를 곱해준다;
    # 내려간 온도를 구하면 지면온도에서 뺀다 --> 이것이 입력 된 고도의 온도 

if height % step != 0: # 그런데 올라간 고도가 60m씩 단계별로 올라간 것보다 (60m보다는 작지만) 좀 더 올라갔다면(e.g. 135m),
    targetTemp -= stepTemp # 그 올라간 것에 대한 기온도 빼주자

print('지면 온도: {}'.format(baseTemp))
print('고도 %dm의 기온: %.2f' % (height, targetTemp))


# 197개의 빵과 152개의 우유를 17명의 학생한테 동일하게 나눠 준다고 할 때,
# 한 명의 학생이 갖게되는 빵과 우유 개수를 구하고 남는 빵과 우유 개수를 출력하자.

bread = 197
milk = 152
student_cnt = 17

# 학생 한명이 갖게되는 빵과 우유 개수 구하기
print('학생 한명이 갖게되는 빵 개수: {}'.format(bread // student_cnt)) # 빵 수를 학생 수로 나눈 몫이 학생 한명이 갖게 되는 빵 개수
print('학생 한명이 갖게되는 우유 개수: {}'.format(milk // student_cnt))

# 남는 빵과 우유 개수 구하기
print('남는 빵 개수: {}'.format(bread % student_cnt)) # 빵 수를 학생 수로 나눈 나머지가 남는 빵 개수
print('남는 우유 개수: {}'.format(milk % student_cnt))


# 다음 내용을 참고해서 백신 접종 대상자를 구분하기 위한 프로그램을 만들어 보자. (나이 입력)
'''
"19세 이상 또는 65세 이하이면 출생 연도 끝자리에 따른 접종, 그렇지 않으면 하반기 일정 확인"
'''
inputAge = int(input('나이 입력:'))

if inputAge >= 29 or inputAge <= 65:
    endNum = int(input('출생 연도 끝자리 입력:'))
    if endNum == 1 or endNum == 6:
        print('월요일 접종 가능')
    elif endNum == 2 or endNum == 7:
        print('화요일 접종 가능')
    elif endNum == 3 or endNum == 8:
        print('수요일 접종 가능')
    elif endNum == 4 or endNum == 9:
        print('목요일 접종 가능')
    elif endNum == 5 or endNum == 0:
        print('금요일 접종 가능')
else:
    print('하반기 일정 확인')


# 길이(mm)를 입력하면 inch로 환산하는 프로그램을 만들어보자.(1mm = 0.039inch)

byInch = 0.039
lengthMM = int(input('길이(mm) 입력:'))

# inch로 계산
lengthInch = lengthMM * byInch

print('{}mm -> {}inch'.format(lengthMM, lengthInch))


조건문

# 교통 과속 위반 프로그램을 만들어보자.

carSpeed = int(input('속도 입력: '))
limitSpeed = 50 #제한속도

# 속도가 50km/h 초과시
if carSpeed > 50:
    print('안전속도 위반! 과태료 5만원 부과 대상.')

# 속도가 50km/h 미만이라면
# if carSpeed <= 50:
else:
    print('안전속도 준수!')


# 문자 메시지 길이에 따라 문자 요금이 결정되는 프로그램을 만들어보자.
'''
- 문자 길이 50이하 --> SMS발송(50원 부과)
- 문자 길이 50초과 --> MMS발송(100원 부과)
'''
message = input('메시지 입력: ')
lenMessage = len(message) #메시지 길이
msgPrice = 50 # 기본 요금 50원으로 설정

if lenMessage <= 50:
    msgPrice = 50
    print('SMS발송')
# else:
if lenMessage > 50:
    msgPrice = 100
    print('MMS발송')

print('메시지 길이: {}'.format(lenMessage))
print('메시지 발송 요금: {}'.format(msgPrice))


# 국어, 영어, 수학, 과학 국사 점수를 입력하면 총점을 비롯한 각종 데이터가 출력되는 프로그램을 만들어보자.
'''
과목별 점수를 입력하면 총점, 평균, 편차를 출력한다.
평균은 다음과 같아: 국어 85, 영어 82, 수학 89, 과학 75, 국사 94
각종 편차 데이터는 막대그래프로 시각화한다.
'''
# 과목별 평균 점수 합계 및 전체 평균
korAvg = 85; engAvg = 82; matAvg = 89; sciAvg = 75; hisAvg = 94 # 과목별 평균 할당
totalAvg = korAvg + engAvg + matAvg + sciAvg + hisAvg
avgAvg = int(totalAvg / 5) #나누면 소수점으로 나올 테니, 간단하게 int()로 변형시키자

# 과목별 점수 입력
korScore = int(input('국어 점수: '))
engScore = int(input('영어 점수: '))
matScore = int(input('수학 점수: '))
sciScore = int(input('과학 점수: '))
hisScore = int(input('국사 점수: '))

# 입력한 점수의 총점 및 전체 평균
totalScore = korScore + engScore + matScore + sciScore + hisScore
avgScore = int(totalScore / 5)

# 과목별 편차
korGap = korScore - korAvg
engGap = engScore - engAvg
matGap = matScore - matAvg
sciGap = sciScore - sciAvg
hisGap = hisScore - hisAvg

# 총점 편차 및 전체 평균 편차
totalGap = totalScore - totalAvg
avgGap = avgScore - avgAvg

# 총점, 평균, 편차 출력
print('-'*30)
print('총점: {}({}), 평균: {}({})'.format(totalScore, totalGap, avgScore, avgGap))
print('국어: {}({}), 영어: {}({}), 수학: {}({}), 과학: {}({}), 국사: {}({})'.format(
    korScore, korGap, engScore, engGap, matScore, matGap, sciScore, sciGap, hisScore, hisGap))
print('-'*30)

# 각 과목별 편차 시각화
str = '+' if korGap > 0 else '-' # 편차가 양수이면 +, 음수이면 -로 시각화
print('국어 편차: {}({})'.format(str * abs(korGap), korGap)) #편차 수 만큼 '+'이 찍혀야함; 편차가 음수일 수도 있어서 절대값으로 바뀌게 적용 abs()
str = '+' if engGap > 0 else '-'
print('영어 편차: {}({})'.format(str * abs(engGap), engGap))
str = '+' if matGap > 0 else '-'
print('수학 편차: {}({})'.format(str * abs(matGap), matGap))
str = '+' if sciGap > 0 else '-'
print('과학 편차: {}({})'.format(str * abs(sciGap), sciGap))
str = '+' if hisGap > 0 else '-'
print('국사 편차: {}({})'.format(str * abs(hisGap), hisGap))
# 총점 및 평균 편차 시각화
str = '+' if totalGap > 0 else '-'
print('총점 편차: {}({})'.format(str * abs(totalGap), totalGap))
str = '+' if avgGap > 0 else '-'
print('평균 편차: {}({})'.format(str * abs(avgGap), avgGap))


# 난수를 이용해서 홀/짝 게임을 만들어보자.
import random

comNum = random.randint(1, 2) # 1과 2 사이의 정수 중에서 하나를 반환; 컴퓨터 홀/짝
userSelect = int(input('홀/짝 선택: 1.홀 \t 2.짝')) # 내가 입력한 홀/짝

if comNum == 1 and userSelect == 1: # 컴퓨터도 1이고 나도 1이면; 맞췄다면
    print('빙고! 홀수!')
elif comNum == 2 and userSelect == 2:
    print('빙고! 짝수!')
elif comNum == 1 and userSelect == 2:
    print('실패! 홀수!') 
elif comNum == 2 and userSelect == 1:
    print('실패! 짝수!') 


# 난수를 이용해서 가위,바위, 보 게임을 만들어보자.
import random

comNumber = random.randint(1, 3)
userNumber = int(input('가위, 바위, 보 선택: 1.가위 \t 2.바위 \t 3.보'))

# 컴퓨터가 지고 내가 이기는 경우
if (comNumber == 1 and userNumber == 2) or \
    (comNumber == 2 and userNumber == 3) or \
    (comNumber == 3 and userNumber == 1):
    print('컴퓨터: 패, 유저: 승')
# 같은 것을 낸 경우; 무승부
elif comNumber == userNumber:
    print('무승부')
# 컴퓨터가 이기고 내가 진 경우
else:
    print('컴퓨터: 승, 유저; 패')
    
print('컴퓨터: {}, 유저: {}'.format(comNumber, userNumber))


# 상수도 요금 계산기를 만들어보자.
# 업종별 그리고 사용량에 따른 단가
'''
업종별 -  가정용 |             대중탕용            |      공업용
사용량 -        | 50이하,  50초과 300이하, 300초과 | 500이하, 500초과
단가(원) - 540  |  820원,     1,920원,    2,400원 |  240원,   470원
'''
part = int(input('업종 선택(1.가정용 | 2.대중탕용 | 3.공업용): ')) #업종 선택
useWater = int(input('사용량 입력: ')) # 사용량 입력
unitPrice = 0 # 단가는 업종에 따라 달라질 것이기에 일단 0으로

# 가정용
if part == 1:
    unitPrice = 540
    pass

# 대중탕용
elif part ==2:
    if useWater <= 50:
        unitPrice = 820
    elif useWater > 50 and useWater <= 300:
        unitPrice = 1920
    elif useWater > 300:
        unitPrice = 2400

# 공업용
elif part == 3:
    if useWater <= 500:
        unitPrice = 240
    else:
        unitPrice = 470

print('='*30)
print('상수도 요금표')
print('-'*30)
print('사용량 \t : \t 요금')
usePrice = useWater * unitPrice
print('{} \t : \t {}원'.format(useWater, format(usePrice, ',')))
print('='*30)


# 미세먼지 비상저감조치로 차량 운행제한 프로그램을 다음 내용에 맞게 만들어 보자.
'''
- 미세먼지 측정 수치가 150 이하면 차량 5부제 실시
- 미세먼지 측정 수치가 150을 초과하면 차량 2부제 실시
- 차량 2부제를 실시하더라도 영업용차량은 5부제 실시
- 미세먼지 수치, 차량 종류, 차량 번호를 입력하면 운행 가능 여부 출력
'''
import datetime

today = datetime.datetime.today() # 오늘 날짜 변수 할당
day = today.day # 오늘 날짜의 일; 이 날짜를 가지고 나의 차량 번호와 비교를 해서 2부제인지 5부제인지 판단을 할 것

limitDust = 150 # 운행제한조치 판단 기준이 되는 미세먼지 수치
dustNum = int(input('미세먼지 수치 입력: '))
carType = int(input('차량 종류 선택: 1.승용차 \t 2.영업용차'))
carNumber = int(input('차량 번호 입력: ')) # 끝 자리 비교를 위한 int로 변환

print('-'*30)
print(today)
print('-'*30)
# 만약 미세먼지 수치가 limit을 초과하고, 차량 종류가 승용차라면 2부제 실시
if dustNum > limitDust and carType == 1:
    # 2부제는 차량 뒷 번호가 짝수냐 홀수냐에 따라 운행 가능 여부가 결정되기에, 2로 나눈 나머지가 같은지를 비교하면 된다
    if (day % 2) == (carNumber % 2): # 오늘이 짝수일인데 차번호도 짝수이면 운행 불가능
        print('차량 2부제 적용')
        print('차량 2부제로 금일 운행제한 대상 차량입니다.')
    else: # 오늘이 짝수일인데, 차번호가 홀수라면 운행 가능
        print('금일 운행 가능합니다.')

# 미세먼지 수치를 초과했지만, 영업용 차량인 경우 5부제 실시
if dustNum > limitDust and carType == 2:
    if (day % 5) == (carNumber % 5): 
        print('차량 5부제 적용')
        print('차량 5부제로 금일 운행제한 대상 차량입니다.')
    else:
        print('금일 운행 가능합니다.')

# 미세먼지 수치 limit 이하라면, 모든 차량 5부제 실시
if dustNum <= limitDust:
    if (day % 5) == (carNumber % 5): 
        print('차량 5부제 적용')
        print('차량 5부제로 금일 운행제한 대상 차량입니다.')
    else:
        print('금일 운행 가능합니다.')
print('-'*30)


# PC에서 난수를 발생하면 사용자가 맞추는 게임을 만들어보자.
'''
- PC가 난수(1~1000)를 발생하면 사용자가 숫자(정수)를 입력한다.
- 사용자가 난수를 맞추면 게임이 종료된다.
- 만약, 못 맞추게 되면 난수와 사용자 숫자의 크고 작음을 출력한 후 사용자한테 다시 기회를 준다.
- 최종적으로 사용자가 시도한 횟수를 출력한다.
'''
import random

rNum = random.randint(1, 1000)
tryCount = 0 # 시도 횟수; 처음엔 0으로 지정
gameFlag = True # 게임이 진행되느냐 안 진행되느냐 반복문으로 계속 물어봐야 하니

while gameFlag:
    tryCount += 1 # 게임이 한번 진행될 때마다 시도횟수 1씩 증가
    pNum = int(input('1에서 1,000까지의 정수 입력: '))
    # 만약 난수를 맞췄다면
    if rNum == pNum:
        print('빙고!')
        gameFlag = False # 난수를 맞추면 게임을 종료
    # 맞지 않다면, 내가 입력한 숫자가 난수보다 큰지 작은지 알려주기
    else: 
        if rNum > pNum:
            print('난수가 크다!')
        else:
            print('난수가 작다!')
            
print('난수: {}, 시도 횟수: {}'.format(rNum, tryCount))


# 실내온도를 입력하면 스마트에어컨 상태가 자동으로 설정되는 프로그램을 만들어보자.
'''
실내온도(에어컨 상태)
18도 이하(off) | 18도 초과 22도 이하(매우 약) | 22도 초과 24도 이하(약) | 24도 초과 26도 이하(중) | 26도 초과 28도 이하(강) | 28도 초과(매우 강)
'''
innerTemp = int(input('실내온도 입력:'))

if innerTemp <= 18:
    print('에어컨 off')
elif innerTemp > 18 and innerTemp <= 22:
    print('매우 약')
elif innerTemp > 22 and innerTemp <= 24:
    print('약')
elif innerTemp > 24 and innerTemp <= 26:
    print('중')
elif innerTemp > 26 and innerTemp <= 28:
    print('강')
elif innerTemp > 28:
    print('매우 강')


반복문

# 1부터 100까지 정수 중 십의자리와 일의자리에 대해 각각 홀/짝수를 구분하는 프로그램을 만들어보자.
# 횟수가 명확하니 for문이 더 적합
for i in range(1, 101):
    # 일단 한자리 수인 9까지 먼저
    if i <= 9:
        if i % 2 == 0: # 짝수인 경우
            print('[{}]: 짝수!'.format(i))
        else:
            print('[{}]: 홀수!'.format(i))
    # 10 이상인 (두 자리인) 수
    else:
        num10 = i // 10 # 10으로 나눈 몫이 10의 자리 수
        num1 = i % 10 # 10으로 나눈 나머지가 1의 자리 수
        
        # 10의 자리 홀/짝수 구분
        result10 = '' # 비교를 해야 하니 result10 이라는 변수 생성
        if num10 % 2 == 0: # 10의 자리 수가 짝수라면
            result10 = '짝수'
        else:
            result10 = '홀수'
        # 1의 자리 홀/짝수 구분
        result1 = '0'
        if num1 != 0: # 1의 자리 숫자가 0이 아닌 경우에만; 0은 홀/짝수 모두 아니기에
            if num1 % 2 == 0: # 10의 자리 수가 짝수라면
                result1 = '짝수'
            else:
                result1 = '홀수'
        # else:
        #    result1 = '0' # 위에 result1 = '0'이렇게 선언해 주었기에, 애초에 0이 된다; 그러니 이 else문은 생략 가능
        
        print('[{}] 십의자리: {}, 일의자리: {}'.format(i, result10, result1))


# 1부터 사용자가 입력한 정수까지의 합, 홀수의 합, 짝수의 합 그리고 팱토리얼을 출력하는 프로그램을 만들어보자.
# 횟수가 명확하니 for문이 더 적합

fNum = int(input('정수 입력: '))

# 정수까지의 합
addSum = 0 # 합계를 구할 변수
for i in range(1, (fNum+1)): # fNum까지 돌아야 하니 +1해줘야 함
    addSum += i

addSumFormatted = format(addSum, ',')
print('정수까지의 합 결과: {}'.format(addSumFormatted))

# 홀수의 합
oddSum = 0
for i in range(1, (fNum+1)):
    if i % 2 != 0: # 짝수가 아닌 경우
        oddSum += i

oddSumFormatted = format(oddSum, ',')
print('홀수 합 결과: {}'.format(oddSumFormatted))

# 짝수의 합
evenSum = 0
for i in range(1, (fNum+1)):
    if i % 2 == 0: # 짝수가 아닌 경우
        evenSum += i

evenSumFormatted = format(evenSum, ',')
print('짝수 합 결과: {}'.format(evenSumFormatted))

# 팩토리얼
factorialResult = 1 # 0이면 영원히 0이 나올테니 1로
for i in range(1, (fNum+1)):
    factorialResult *= i

factorialResultFormatted = format(factorialResult, ',')
print('팩토리얼 결과: {}'.format(factorialResultFormatted))


# '*'을 이용해서 다음과 같이 다양한 모양을 출력해보자.

for i in range(1,6): # range(0,5)로 하면 0은 아무것도 없으니 *도 안 찍힐 테니 1부터 시작
    for j in range(i): # 한번 반복하면서 *을 그 줄에 찍기 때문에, 중첩 반복문 사용
        print('*', end='') # 개행하지 않고, 계속 그 줄 옆으로 찍어나가야 하니 end=''
    print() # 한 줄 * 찍는게 끝나면 개행해야 하니 여기에 print()


for i1 in range(1, 6):
    # 띄어쓰기(공백) 출력
    for i2 in range(6-i1-1): # 만약 i가 처음에 1이 들어오면 6에서 1을 빼면 5(반복 횟수), 5에서 1(별 수)을 뺀 4만큼 띄어쓰기(공백) 해라 라는 것
        print(' ', end='') 
     # * 출력
    for i3 in range(i1):
        print('*', end='')
    print() # 반복이 실행되면서 공백은 점점 적어질 것이고, *은 많아질 것이다.


for i in range(5, 0, -1): # 5에서 1까지 거꾸로 내려가기
    for j in range(i):
        print('*', end='')
    print() # 개행


for i in range(5, 0, -1):
    # 띄어쓰기 출력
    for j in range(5 - i): # 처음에 5가 들어오면 반복하지 않을거고, 4가 들어오면 1번 반복하며 공백 1개 찍을 거고, ...
        print(' ', end='')
    # * 출력
    for j in range(i): # 5, 4, 3.. 이렇게 * 찍으면 되니 그대로 i 사용; j를 또 쓴 이유: 어차피 지역변수여서 또 사용해도 된다
        print('*', end='')
    print() # 개행


for i in range(1, 10):
    if i < 6: # 일단 *이 증가하는, 위 절반에 대한 코드 (5를 넣어도 되고 6을 넣어도 결과는 같다)
        for j in range(i):
            print('*', end='')
    else:
        for j in range(10-i): # 거꾸로 내려간다(i가 5가 되면 5, 6이 되면 4...
            print('*', end='')
    print() # 처음에는 증가하다가 10-i를 빼면서 부터는 감소


for i in range(1, 6):
    for j in range(1, 6):
        if j == i: # i와 j가 같을 때만 출력; 공백이 되어야 하는 부분이 아닌 *을 찍어야 하는 부분일 때에만 출력시키는 것
                   # 쉽게 말해, i는 행을 나타낸다고 보면 되고, j는 열을 나타낸다고 보면 됨, 행과 열이 같은 곳에서만 출력
            print('*', end='')
        else:
            print(' ', end='')
    print()


# 집 앞 버스 정류장에서 학교까지 가는 버스 A, B, C의 운행정보가 다음과 같을 때, 2대 이상의 버스가 정차하는 시간대를 출력해보자.
# 최소공배수 문제
'''
버스 A, B 운행 정보
- 오전 6시 첫차 : 오후 23시 운행 종료
- 버스A : 15분 간격 운행
- 버스B : 13분 간격 운행
버스 C 운행 정보
- 6시 20분 첫차 : 오후 22시 운행 종료
- 버스C : 8분 간격 운행
'''
busA = 15
busB = 13
busC = 8

totalMin = 60*17 # 6시부터 23시까지니까 총 17시간
for i in range(totalMin+1): # 전체 시간동안 반복; -1이 될테니 +1 입력해준다
    # 2대 이상의 버스가 정차하는 시간대라는 건 각 totalMin인 i를 각 버스별 운행시간으로 나눴을 때 0이 되는 부분(i)가 바로 그 시간대가 되겠다
    # 그런데 버스 A, B는 6시부터 차가 있고, C는 6시 20분부터 있다
    # 따라서 분리를 해주어야 겠다
    if i < 20 or i > (totalMin - 60): # 6시부터 출발하고 23시까지 운행하는 것만 따로; 쉽게 말해, 버스 A,B만 운행하고 있을 시간대라면
        if (i % busA == 0) and (i % busB == 0): # i에서 버스A, 버스B 운행시간을 나눴을 때 나머지가 둘 다 0인 경우
            print('busA와 busB 동시 정차', end='')
            # 정확한 시간도 출력
            hour = 6 + (i // 60) # hour는 6시에서부터 i(분)를 60으로 나눈 몫을 더하면 되고
            min = i % 60 # minute은 i(분)를 60으로 나눈 나머지가 된다
            print('\t{}:{}'.format(hour, min))
    else: # 그렇지 않은 경우라면; 이 때엔 A,B,C 모두 운행 중이겠다
        # 버스 A와 B 동시 정차
        if i % busA == 0 and i % busB == 0:
            print('busA와 busB 동시 정차', end='')
            hour = 6 + (i // 60)
            min = i % 60 
            print('\t{}:{}'.format(hour, min))
        # 버스 A와 C 동시 정차
        elif i % busA == 0 and i % busC == 0:
            print('busA와 busC 동시 정차', end='')
            hour = 6 + (i // 60)
            min = i % 60 
            print('\t{}:{}'.format(hour, min))
        # 버스 B와 C 동시 정차
        elif i % busB == 0 and i % busC == 0:
            print('busB와 busC 동시 정차', end='')
            hour = 6 + (i // 60)
            min = i % 60 
            print('\t{}:{}'.format(hour, min))


# 톱니가 각가 n1개와 n2개의 톱니바퀴가 서로 맞물려 회전할 때,
# 회전을 시작한 후 처음 맞물린 톱니가 최초로 다시 만나게 될 때까지의
# 톱니의 수와 각각의 바퀴 회전수를 출력해보자. (단, n2는 n1보다 크다; n2가 톱니 수가 더 많다)
# 치소공배수 문제
# 예) 만약 A 톱니수가 7이고 B 톱니수가 12라면 7과 12의 공배수인 (곱하면) 84까지 도달하면 다시 만나게 된다.
# 그리고 그 84를 각각의 톱니 수로 나누면 각 톱니별로 몇번 회전을 했는지도 계산 할 수 있다. --> A는 12회전, B는 7회전

gearATCnt = int(input('GearA 톱니수 입력: '))
gearBTCnt = int(input('GearB 톱니수 입력: '))

gearA = 0 # 톱니가 몇 번 지나갔는지 담아두는 변수
gearB = 0
leastNum = 0 # 최소공배수 구하는 계산이니

flag = True
while flag: # flag가 False가 될 때까지 반복시킬 것이다
    # GearA
    if gearA != 0:
        if gearA != leastNum: # 최소공배수에 도달하기 전까진
            gearA += gearATCnt # 계속 회전할 테니 톱니수만큼 누적 될테고
        else: # 최소공배수에 도달하게 되면
            flag = False # while문을 빠져나와야 겠다
    else: # 0인 경우는 별 의미 없지만; 일단 기어가 돌아가기 시작해야 하니
        gearA += gearATCnt # 사용자가 입력한 만큼 증가 및 할당
    
    # (GearB가 더 크며) GearB가 12, 24, 36... 이렇게 계속 지나갈/늘어날 텐데, 그것을 A의 톱니 수로 나눈 나머지가 0이 될 때가 최소공배수가 되는 지점
    if gearB != 0 and gearB % gearATCnt == 0: 
        leastNum = gearB
    else: # 하지만 그렇지 않은 경우, GearB는 계속 돌아갈테니
        gearB += gearBTCnt # 이렇게 톱니 수만큼 계속 누적 되겠다

print('최초 만나는 톱니수(최소공배수): {}톱니'.format(leastNum))
print('gearA 회전수: {}회전'.format(int(leastNum / gearATCnt))) # 최소공배수를 톱니수로 나누면 최소공배수에 도달하기까지의 회전 수; 보기좋게 하려고 int()
print('gearB 회전수: {}회전'.format(int(leastNum / gearBTCnt)))


# 윤년 계산기를 만들어보자.
'''
윤년 조건 (윤년: 4년마다 돌아오되, 아래 조건)
- 연도가 4로 나누어떨어지고 100으로 나누어떨어지지 않으면 윤년이다.
- 또는 연도가 400으로 나누어떨어지면 윤년이다.
'''
year = int(input('연도 입력:'))

if (year % 4 == 0 and year & 100 != 0) or (year % 400 == 0):
    print('{}년: 윤년'.format(year))
else:
    print('{}년: 평년'.format(year))


# 추가적으로, 향후 100년 중 어느 연도가 윤년인지 보여주는 것도 만들기.
for year in range(2021, (2021+101)): # 2021~20120년까지
    if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):
        print('{}년: 윤년'.format(year))
    else:
        print('{}년: 평년'.format(year))


0개의 댓글