계속해서 자료구조나 기초수학 관련 문제가 나온다.
뒤에 강의가 있지만 하루이틀 만에 들을 양이 아니다...
자료구조와 기초수학을 먼저 듣고 문제를 풀어야 하나 고민이다...
premultatioin.py
def getPermutationCnt(n,r):
result = 1
for n in range(n,n-r, -1):
#n이 무슨 숫자가 나오는지
print('n:{}'.format(n))
result = result * n
return result
main04.py
import permultation as pt
numN = int(input('numN 입력: '))
numR = int(input('numR 입력: '))
print(f'{numN}P{numR}: {pt.getPermutationCnt(numN,numR)}')
numN 입력: 8
numR 입력: 3
n:8
n:7
n:6
8P3: 336
premultatioin.py
def getPermutationCnt(n,r, logPrint = True):
result = 1
for n in range(n,n-r, -1):
#n이 무슨 숫자가 나오는지
if logPrint: print('n:{}'.format(n))
result = result * n
return result
main04.py
import permultation as pt
numN = int(input('numN 입력: '))
numR = int(input('numR 입력: '))
print(f'{numN}P{numR}: {pt.getPermutationCnt(numN,numR,logPrint=False)}')
numN 입력: 8
numR 입력: 3
8P3: 336
permulrarion.py
from itertools import permutations
def getPermutarions(ns,r):
pList = list(permutations(ns,r))
print(f'{len(ns)}P{r} 개수 : {len(pList)}')
for n in permutations(ns,r):
print(n, end='')
main04.py
import permultation as pt
listVar = [1,2,3,4,5,6,7,8]
rVar = 3
pt.getPermutarions(listVar,rVar)
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)(1, 3, 5)(1, 3, 6)(1, 3, 7)(1, 3, 8)(1, 4, 2)(1, 4, 3)(1, 4, 5)(1, 4, 6)(1, 4, 7).....
combination.py
def getCombinationCnt(n,r):
#P의 결과 초기값
resultP = 1
#r팩토리얼 결과 초기값
resultR = 1
#Combination 결과 초기값
resultC = 1
for n in range(n,(n-r),-1):
resultP = resultP * n
for n in range(r,0 ,-1):
resultR = resultR * n
resultC = int(resultP / resultR)
return resultC
main05.py
import combination as cb
nNum = int(input('numN입력: '))
rNum = int(input('numR입력: '))
print(f'{nNum}C{rNum}: {cb.getCombinationCnt(nNum,rNum)}')
numN입력: 8
numR입력: 3
8C3: 56
combination.py
from itertools import combinations
def getCombinations(ns, r):
#list()함수 알아보기
cList = list(combinations(ns,r))
print(f'{len(ns)}C{r}: {len(cList)}')
#모든 경우의 수 출력 반복문
for n in combinations(ns,r):
print(n,end='')
main05.py
#모듈을 이용한 조합 계산
import combination as cb
listVar = [1,2,3,4,5,6,7,8]
rVar = 3
cb.getCombinations(listVar,rVar)
8C3: 56
(1, 2, 3)(1, 2, 4)(1, 2, 5)(1, 2, 6)(1, 2, 7)(1, 2, 8)(1, 3, 4)(1, 3, 5)(1, 3, 6)(1, 3, 7)(1, 3, 8)(1, 4, 5)(1, 4, 6)(1, 4, 7)(1, 4, 8)(1, 5, 6)....
utilityBill.py
#수입, 공과금 처리 모듈
income = 0
#이런 변수 값을 설정하는 함수(set), 얻어오는 함수(get)만들어 준다. 보통 셋터, 겟터라 한다.
waterPrice = 0; electricPrice=0; gasPrice=0
#셋터
def setIncome(ic):
global income
income = ic
#겟터
def getIncome():
return income
#셋터
def setWaterPrice(wp):
global waterPrice
waterPrice = wp
#겟터
def getWaterPrice(wp):
return waterPrice
#셋터
def setElectricPrice(ec):
global electricPrice
electricPrice = ec
#겟터
def getElectricPrice():
return electricPrice
#셋터
def setGasPrice(gc):
global gasPrice
gasPrice = gc
#겟터
def getGasPrice():
return gasPrice
def getUtilityBill():
result = waterPrice + electricPrice + gasPrice
return result
def getUtilityBillRate():
result = getUtilityBill()/getIncome() * 100
return result
main06.py
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('공과금 : {} 원'.format(format(ub.getUtilityBill(), ',')))
print(f'수입 대비 공과금 비율 : {ub.getUtilityBillRate()}%')
수입 입력: 3000000
수도요금 입력: 15000
전기요금 입력: 17500
가스요금 입력: 125000
공과금 : 157500 원
공과금 : 157,500 원
수입 대비 공과금 비율 : 5.25%
- 패키지 구성 후 각 모듈마다 함수 만들기
baisic_operator.py
def addCal(n1,n2):
return round(n1 + n2, 2)
def subCal(n1,n2):
return round(n1 + n2, 2)
def mulCal(n1,n2):
return round(n1 * n2, 2)
def divCal(n1,n2):
return round(n1 / n2, 2)
developer_operator.py
def modCal(n1,n2):
return round(n1 % n2, 2)
def floorCal(n1,n2):
return round(n1 // n2, 2)
def powCal(n1,n2):
return round(n1 ** n2, 2)
circle_area.py
def calCircleArea(r):
return round(r**2*3.14,2)
triangle_square_area.py
def calTriangleArea (w,h):
return round(w*h/2 ,2)
def calSquareArea(w,h):
return round(w*h,2)
main07.py
#패키지 모듈 호출
from arithmetic import basic_operator as bo
from arithmetic import developer_operator as do
from shape import triangle_square_area as tsa
from shape import circle_area as ca
#계산기
inputNumber1 = float(input('숫자1 입력: '))
inputNumber2 = float(input('숫자2 입력: '))
print(f'{inputNumber1} + {inputNumber2} = {bo.addCal(inputNumber1,inputNumber2)}')
print(f'{inputNumber1} - {inputNumber2} = {bo.subCal(inputNumber1,inputNumber2)}')
print(f'{inputNumber1} * {inputNumber2} = {bo.mulCal(inputNumber1,inputNumber2)}')
print(f'{inputNumber1} / {inputNumber2} = {bo.divCal(inputNumber1,inputNumber2)}')
print(f'{inputNumber1} % {inputNumber2} = {do.modCal(inputNumber1,inputNumber2)}')
print(f'{inputNumber1} // {inputNumber2} = {do.floorCal(inputNumber1,inputNumber2)}')
print(f'{inputNumber1} ** {inputNumber2} = {do.powCal(inputNumber1,inputNumber2)}')
#삼각형,사각형 넓이
inputWidth = float(input('가로길이 입력: '))
inputHeight = float(input('세로길이 입력: '))
print(f'삼각형 넓이 : {tsa.calTriangleArea(inputWidth,inputHeight)}')
print(f'사각형 넓이 : {tsa.calSquareArea(inputWidth,inputHeight)}')
#원 넓이
inputRadius = float(input('반지름 길이 입력: '))
print(f'원의 넓이 : {ca.calCircleArea(inputRadius)}')
숫자1 입력: 10.5
숫자2 입력: 2
10.5 + 2.0 = 12.5
10.5 - 2.0 = 12.5
10.5 * 2.0 = 21.0
10.5 / 2.0 = 5.25
10.5 % 2.0 = 0.5
10.5 // 2.0 = 5.0
10.5 ** 2.0 = 110.25
가로길이 입력: 11.5
세로길이 입력: 8
삼각형 넓이 : 46.0
사각형 넓이 : 92.0
반지름 길이 입력: 6.5
원의 넓이 : 132.66
member.py
class Member:
def __init__(self,i,p):
self.id = i
self.pw = p
class MemberRepository:
def __init__(self):
#{}:딕셔너리, {키:밸류}
self.members = {}
#m은 Member클래스에서 생성된 맴버
def addMember(self, m):
#키 값은 id, 밸류값은 pw
self.members[m.id] = m.pw
def loginMember(self,i,p):
isMember = i in self.members
if isMember and self.members[i] == p:
print(f'{i}: log-in success!')
else:
print(f'{i}: log-in fail')
def removeMember(self,i,p):
del self.members[i]
def printMembers(self):
for mk in self.members.keys():
print(f'ID : {mk}')
print(f'PW : {self.members[mk]}')
main01.py
import maember as mb
mems = mb.MemberRepository()
#3명의 아이디,비번 입력해 회원가입
for i in range(3):
mId = input('아이디 입력: ')
mPw = input('비밀번호 입력: ')
mem = mb.Member(mId,mPw)
mems.addMember(mem)
#회원가입이 잘 되었는지 회원 조회
mems.printMembers()
#회원 로그인 성공 유무 확인
mems.loginMember('abc@gmail.com','1234')
mems.loginMember('def@gmail.com','5678')
mems.loginMember('ghi@gmail.com','9012')
#회원 삭제
mems.removeMember('abc@gmail.com','1234')
#삭제가 잘되었는지 현재 회원 조회
mems.printMembers()
아이디 입력: abc@gmail.com
비밀번호 입력: 1234
아이디 입력: def@gmail.com5678
비밀번호 입력: 5678
아이디 입력: ghi@gmail.com
비밀번호 입력: 9012
ID : abc@gmail.com
PW : 1234
ID : def@gmail.com5678
PW : 5678
ID : ghi@gmail.com
PW : 9012
abc@gmail.com: log-in success!
def@gmail.com: log-in fail
ghi@gmail.com: log-in success!
ID : def@gmail.com5678
PW : 5678
ID : ghi@gmail.com
PW : 9012
smartTV.py
class NormalTV:
def __init__(self,i=32,c='black',r='full-HD'):
self.inch = i
self.color = c
self.resolution = r
self.smartTV = 'off'
self.arTV = 'off'
def turnOn(self):
print('TV power on!!')
def turnOff(self):
print('TV power off!!')
def printTvInfo(self):
print(f'inch = {self.inch}inch')
print(f'inch = {self.color}')
print(f'inch = {self.resolution}')
print(f'inch = {self.smartTV}')
print(f'inch = {self.arTV}')
class Tv4K(NormalTV):
def __init__(self,i,c,r='4K'):
super().__init__(i,c,r)
def setSmartTv(self,s ):
self.smartTV = s
class Tv8K(NormalTV):
def __init__(self,i,c,r='8K'):
super().__init__(i,c,r)
def setSmartTv(self,s ):
self.smartTV = s
def setAiTv(self,a):
self.aiTv = a
main02.py
import smartTV as st
my4kTv = st.Tv4K('65','silver','4K')
my4kTv.setSmartTv('on')
my4kTv.turnOn()
my4kTv.printTvInfo()
my4kTv.turnOff()
print('='*30)
friend4kTv = st.Tv4K('55','white','4K')
my4kTv.setSmartTv('off')
my4kTv.turnOn()
my4kTv.printTvInfo()
my4kTv.turnOff()
print()
print('='*30)
my8kTv = st.Tv8K('75','black','8K')
my8kTv.setSmartTv('on')
my8kTv.setAiTv('on')
my8kTv.turnOn()
my8kTv.printTvInfo()
my8kTv.turnOff()
print('='*30)
friend8kTv = st.Tv8K('75','orange','8K')
my8kTv.setSmartTv('off')
my8kTv.setAiTv('off')
my8kTv.turnOn()
my8kTv.printTvInfo()
my8kTv.turnOff()
TV power on!!
inch = 65inch
color = silver
resolution = 4K
smartTV = on
aiTV = off
TV power off!!
==============================
TV power on!!
inch = 65inch
color = silver
resolution = 4K
smartTV = off
aiTV = off
TV power off!!
TV power on!!
inch = 75inch
color = black
resolution = 8K
smartTV = on
aiTV = off
TV power off!!
==============================
TV power on!!
inch = 75inch
color = black
resolution = 8K
smartTV = off
aiTV = off
TV power off!!
book.py
class Book:
def __init__(self,name, price, isbn):
self.bName = name
self.bPrice = price
self.bIsbn = isbn
class BookRepository:
def __init__(self):
self.bDic = {}
def registBook(self, b):
self.bDic[b.bIsbn] = b
def removeBook(self, isbn):
del self.bDic[isbn]
def printBooksInfo(self):
for isbn in self.bDic.keys():
b = self.bDic[isbn]
print(f'{b.bName},{b.bPrice},{b.bIsbn}')
def printBookInfo(self, isbn):
if isbn in self.bDic:
b = self.bDic[isbn]
print(f'{b.bName},{b.bPrice},{b.bIsbn}')
else:
print('Lookup result does not exist')
main03.py
import book as bk
myBRepository = bk.BookRepository()
myBRepository.registBook(bk.Book('python',20000,'12345678'))
myBRepository.registBook(bk.Book('java',25000,'1342358'))
myBRepository.registBook(bk.Book('C/C++',27000,'14324132678'))
myBRepository.printBooksInfo()
print('='*30)
myBRepository.printBookInfo('1342358')
print('='*30)
myBRepository.removeBook('12345678')
myBRepository.printBooksInfo()
python,20000,12345678
java,25000,1342358
C/C++,27000,14324132678
==============================
java,25000,1342358
==============================
java,25000,1342358
C/C++,27000,14324132678
ADictionary.py
from abc import ABCMeta
from abc import abstractmethod
class AbsDictionary(metaclass=ABCMeta):
def __init__(self):
self.wordDic = {}
#등록된 단어 :w1, 번역된 단어:w2
@abstractmethod
def registWord(self, w1, w2):
pass
@abstractmethod
def removeWord(self, w1):
pass
@abstractmethod
def updateWord(self, w1, w2):
pass
@abstractmethod
def searchWord(self, w1):
pass
class KorToEng(AbsDictionary):
def __init__(self):
super().__init__()
#단어 등록
def registWord(self, w1, w2):
print(f'[KorToEng] registWord() : {w1} to {w2}')
self.wordDic[w1] = w2
#등록된 단어 삭제
def removeWord(self, w1):
print(f'[KorToEng] removeWord() : {w1}')
del self.wordDic[w1]
#등록된 단어 업데이트
def updateWord(self, w1, w2):
print(f'[KorToEng] updateWord() : {w1} to {w2}')
self.wordDic[w1] = w2
#등록된 단어 검색
def searchWord(self, w1):
print(f'[KorToEng] searchWord() : {w1}')
return self.wordDic[w1]
#등록된 단어 출력
def printWords(self):
for k in self.wordDic.keys():
print(f'{k}: {self.wordDic[k]}')
main04.py
import ADictionary as dic
#객체 생성
kTe = dic.KorToEng()
#단어 등록
kTe.registWord('책','bok')
kTe.registWord('나비','butterfly')
kTe.registWord('연필','pencil')
kTe.registWord('학생','studend')
kTe.registWord('선생님','teacher')
#등록된 단어 출력
kTe.printWords()
#등록된 단어 업데이트
kTe.updateWord('책', 'book')
kTe.printWords()
#등록된 단어 검색
print(f'{kTe.searchWord("책")}')
#등록된 단어 삭제
kTe.removeWord('책')
kTe.printWords()
[KorToEng] registWord() : 책 to bok
[KorToEng] registWord() : 나비 to butterfly
[KorToEng] registWord() : 연필 to pencil
[KorToEng] registWord() : 학생 to studend
[KorToEng] registWord() : 선생님 to teacher
책: bok
나비: butterfly
연필: pencil
학생: studend
선생님: teacher
[KorToEng] updateWord() : 책 to book
책: book
나비: butterfly
연필: pencil
학생: studend
선생님: teacher
[KorToEng] searchWord() : 책
book
[KorToEng] removeWord() : 책
나비: butterfly
연필: pencil
학생: studend
선생님: teacher
랜덤하게 숫자 생성하여 컴퓨터와 유저 대결 결과 출력
DiceGame.py
import random
class Dice:
def __init__(self):
self.cNum = 0
self.uNum = 0
#컴퓨터 난수, 사용자 난수 셋팅
def setCnum(self):
print('[Dice] setCnum()')
self.cNum = random.randint(1,6)
def setUnum(self):
print('[Dice] setUnum()')
self.uNum = random.randint(1,6)
#주사위 게임 시작
def startGame(self):
print('[Dice] stratGame()')
self.setCnum()
self.setUnum()
#결과 출력
def printResult(self):
print('[Dice] printResult()')
if self.cNum == 0 or self.uNum == 0:
print('주사위 숫자 설정 전 입니다.')
else:
if self.cNum > self.uNum:
print(f'컴퓨터 VS 유저 : {self.cNum} VS {self.uNum}>> 컴퓨터 승')
elif self.cNum < self.uNum:
print(f'컴퓨터 VS 유저 : {self.cNum} VS {self.uNum}>> 유저 승')
elif self.cNum == self.uNum:
print(f'컴퓨터 VS 유저 : {self.cNum} VS {self.uNum}>> 무승부')
main05.py
import DiceGame as dg
dc = dg.Dice()
dc.startGame()
dc.printResult()
[Dice] stratGame()
[Dice] setCnum()
[Dice] setUnum()
[Dice] printResult()
컴퓨터 VS 유저 : 2 VS 4>> 유저 승
1초에 한바퀴 돈다는 가정
car_game\car.py
import random
class Car:
def __init__(self, n='fire car', c='red', s=200):
self.name =n
self.color = c
self.max_speed = s
self.distance = 0
def printCarInfo(self):
print(f'name: {self.name}, color : {self.color}, max_speed : {self.max_speed}')
def controlSpeed(self):
return random.randint(0, self.max_speed)
def getDistanceForHour(self):
return self.controlSpeed() * 1
car_game\racing.py
#잠시 프로그램 중지 시킬 수 있음
from time import sleep
class CarRacing:
def __init__(self):
self.cars = []
self.rankings = []
def startRacing(self):
for i in range(10):
print(f'Racoing : {i+1}바퀴')
for car in self.cars:
car.distance += car.getDistanceForHour()
#1초 동안 프로그램 정지
sleep(1)
self.printCurrentCarDistance()
def printCurrentCarDistance(self):
for car in self.cars:
print(f'{car.name}: {car.distance}\t\t', end='')
print()
def addCar(self,c):
self.cars.append(c)
main06.py
from car_game import racing as rc
from car_game import car
myCarGame = rc.CarRacing()
car01 =car.Car('car01','white',250)
car02 =car.Car('car02','black',200)
car03 =car.Car('car03','yellow',220)
car04 =car.Car('car04','red',280)
car05 =car.Car('car05','blue',150)
myCarGame.addCar(car01)
myCarGame.addCar(car02)
myCarGame.addCar(car03)
myCarGame.addCar(car04)
myCarGame.addCar(car05)
myCarGame.startRacing()
Racoing : 1바퀴
car01: 11 car02: 124 car03: 83 car04: 129 car05: 9
Racoing : 2바퀴
car01: 205 car02: 162 car03: 111 car04: 151 car05: 38
Racoing : 3바퀴
car01: 264 car02: 168 car03: 273 car04: 400 car05: 48
Racoing : 4바퀴
car01: 456 car02: 169 car03: 444 car04: 597 car05: 160
Racoing : 5바퀴
car01: 555 car02: 189 car03: 596 car04: 613 car05: 208
Racoing : 6바퀴
car01: 654 car02: 204 car03: 598 car04: 835 car05: 274
Racoing : 7바퀴
car01: 846 car02: 398 car03: 801 car04: 860 car05: 369
Racoing : 8바퀴
car01: 847 car02: 538 car03: 823 car04: 967 car05: 376
Racoing : 9바퀴
car01: 1089 car02: 715 car03: 1039 car04: 1006 car05: 519
Racoing : 10바퀴
car01: 1274 car02: 770 car03: 1149 car04: 1026 car05: 534
mp3player.py
from time import sleep
import random
class Song:
def __init__(self, t, s, pt):
self.title = t
self.singer = s
self.playtime = pt
def printSongInfo(self):
print(f'Title : {self.title}, Singer : {self.singer}, PlayTime : {self.playtime}')
class Player:
def __init__(self):
self.songList = []
self.isLoop = False
def addSong(self,s):
self.songList.append(s)
def play(self):
if self.isLoop:
while self.isLoop:
for s in self.songList:
print(f'Title : {s.title}, Singer : {s.singer}, PlayTime : {s.playtime}sec')
sleep(s.playtime)
else:
for s in self.songList:
print(f'Title : {s.title}, Singer : {s.singer}, PlayTime : {s.playtime}sec')
sleep(s.playtime)
def suffle(self):
random.shuffle(self.songList)
def setIsLoop(self, flag):
self.isLoop = flag
main07.py
import mp3player as mp3
song01 = mp3.Song('신호등','이무진',3)
song02 = mp3.Song('Permission','BTS',4)
song03 = mp3.Song('Weekend','태연',2)
player = mp3.Player()
#플레이어에 노래 추가
player.addSong(song01)
player.addSong(song02)
player.addSong(song03)
#True이면 무한반복
player.setIsLoop(False)
#매번 결과값이 다를 것
player.suffle()
player.play()
Title : Permission, Singer : BTS, PlayTime : 4sec
Title : 신호등, Singer : 이무진, PlayTime : 3sec
Title : Weekend, Singer : 태연, PlayTime : 2sec
계산식에서 나올 수 있는 오류는 입력한 값의 자료형이 다르거나
나눗셈 관련 연산에서 0으로 나눴을 때
calculator.py
def add(n1,n2):
print('덧셈 연산')
try:
n1 = float(n1)
except:
print('첫번째 피연산자는 숫자가 아닙니다')
return
try:
n2 = float(n2)
except:
print('두번째 피연산자는 숫자가 아닙니다')
return
print(f'{n1}+{n2}={n1+n2}')
def sub(n1, n2):
print('뺄셈 연산')
try:
n1 = float(n1)
except:
print('첫번째 피연산자는 숫자가 아닙니다')
return
try:
n2 = float(n2)
except:
print('두번째 피연산자는 숫자가 아닙니다')
return
print(f'{n1}-{n2}={n1 - n2}')
def mul(n1, n2):
print('곱셈 연산')
try:
n1 = float(n1)
except:
print('첫번째 피연산자는 숫자가 아닙니다')
return
try:
n2 = float(n2)
except:
print('두번째 피연산자는 숫자가 아닙니다')
return
print(f'{n1}*{n2}={n1 * n2}')
def div(n1, n2):
print('나눗셈 연산')
try:
n1 = float(n1)
except:
print('첫번째 피연산자는 숫자가 아닙니다')
return
try:
n2 = float(n2)
except:
print('두번째 피연산자는 숫자가 아닙니다')
return
if n2 == 0:
print('0으로 나눌 수 없습니다.')
return
print(f'{n1}+{n2}={n1 / n2}')
'''
#파이썬 기본 제공 나눗셈 예외처리
try:
print(f'{n1}+{n2}={n1 / n2}')
except ZeroDivisionError as e:
print(e)
print('0으로 나눌 수 없습니다.')
'''
main01.py
import calculator as cal
num1 = input('첫번째 피연산자 : ')
num2 = input('두번째 피연산자 : ')
cal.add(num1,num2)
cal.div(num1,num2)
첫번째 피연산자 : 10
두번째 피연산자 : 5
덧셈 연산
10.0+5.0=15.0
나눗셈 연산
10.0+5.0=2.0
첫번째 피연산자 : 10
두번째 피연산자 : asd
덧셈 연산
두번째 피연산자는 숫자가 아닙니다
나눗셈 연산
두번째 피연산자는 숫자가 아닙니다
첫번째 피연산자 : 10
두번째 피연산자 : 0
덧셈 연산
10.0+0.0=10.0
나눗셈 연산
0으로 나눌 수 없습니다.