문제 출처는 제로베이스 데이터 스쿨
#member.py 클래스
class Member():
def __init__(self, id, pw):
self.id = id
self.pw = pw
class MemberRepository():
def __init__(self):
self.members = {}
def addMember(self, mem):
self.members[mem.id] = mem.pw
def loginMember(self, id, pw):
isMember = id in self.members
if isMember and self.members[id] == pw:
print(f'{id} : log-in success!!!')
else:
print(f'{id} : log-in fail!!!')
def removeMember(self, id, pw):
del self.members[id]
def printMember(self):
for mKey in self.members.keys():
print(f'ID : {mKey}')
print(f'PW : {self.members[mKey]}')
#실행파일
import member as mb
mems = mb.MemberRepository()
for index in range(3):
mId = input('ID 입력 : ')
mPw = input('PW 입력 : ')
mem = mb.Member(mId, mPw)
mems.addMember(mem)
mems.printMember()
mems.loginMember('abc@naver.com', '123')
mems.loginMember('qwe@gmail.com', '456')
mems.loginMember('zxc@daum.net', '677')
mems.removeMember('zxc@daum.net', '678')
mems.printMember()
#출력
ID 입력 : abc@naver.com
PW 입력 : 123
ID 입력 : qwe@gmail.com
PW 입력 : 456
ID 입력 : zxc@daum.net
PW 입력 : 678
ID : abc@naver.com
PW : 123
ID : qwe@gmail.com
PW : 456
ID : zxc@daum.net
PW : 678
abc@naver.com : log-in success!!!
qwe@gmail.com : log-in success!!!
zxc@daum.net : log-in fail!!!
ID : abc@naver.com
PW : 123
ID : qwe@gmail.com
PW : 456
💡함수 만들때 파라미터 넣는 것과 안에서 어떻게 받아줘야하는지 감이 거의 없었다.. 여러번 풀어봐야 할 것 같다.
#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.aiTv = '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'color : {self.color}')
print(f'resolution : {self.resolution}')
print(f'smartTv : {self.smartTv}')
print(f'aiTv : {self.aiTv}')
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
#실행파일
import smartTv as st
my4kTv = st.Tv4k('65', 'grey', '4k')
my4kTv.turnOn()
my4kTv.turnOff()
my4kTv.setSmartTv('on')
my4kTv.printTvInfo()
print('-' * 20)
your4kTv = st.Tv4k('55', 'white', '4k')
your4kTv.setSmartTv('off')
your4kTv.turnOff()
your4kTv.turnOn()
your4kTv.printTvInfo()
print('-' * 20)
my8kTv = st.Tv8k('75', 'blue', '8k')
my8kTv.turnOn()
my8kTv.setSmartTv('on')
my8kTv.setAiTv('on')
my8kTv.printTvInfo()
print('-' * 20)
your8kTv = st.Tv8k('90', 'green', '8k')
your8kTv.turnOff()
your8kTv.setSmartTv('off')
your8kTv.setAiTv('off')
your8kTv.printTvInfo()
print('-' * 20)
#출력
Tv power off~!
inch : 65inch
color : grey
resolution : 4k
smartTv : on
aiTv : off
--------------------
Tv power off~!
Tv power on~!
inch : 55inch
color : white
resolution : 4k
smartTv : off
aiTv : off
--------------------
Tv power on~!
inch : 75inch
color : blue
resolution : 8k
smartTv : on
aiTv : on
--------------------
Tv power off~!
inch : 90inch
color : green
resolution : 8k
smartTv : off
aiTv : off
--------------------
💡normalTv에서 smartTv, aiTv의 초기화를 생각못했고, printInfo함수에서 self를 빼먹었다. 아직 머리에 정리가 완벽히 되지 않은 듯하다
#book.py 파일
class Book:
def __init__(self, n, p, i):
self.bName = n
self.bPrice = p
self.bIsbn = i
class BookRepository():
def __init__(self):
self.bDic = {} #담을 자료구조 딕셔너리로 생성
def registBook(self, b):
self.bDic[b.bIsbn] = b
def removeBook(self, i):
del self.bDic[i]
def printBooksInfo(self):
for isbnIndex in self.bDic.keys():
b = self.bDic[isbnIndex]
print(f'{b.bName}, {b.bPrice}, {b.bIsbn}')
def printBookInfo(self, i):
if i in self.bDic:
b = self.bDic[i]
print(f'{b.bName}, {b.bPrice}, {b.bIsbn}')
else:
print('Lookup result does not exist')
#실행파일
import book as bk
bookList = bk.BookRepository()
bookList.registBook(bk.Book('python', 20000, '1234567890'))
bookList.registBook(bk.Book('java', 25000, '43218765'))
bookList.registBook(bk.Book('c++', 27000, '12387698'))
print('-' * 30)
bookList.printBooksInfo()
bookList.printBookInfo('1234567890')
bookList.printBookInfo('12387698')
print('-' * 30)
bookList.removeBook('1234567890')
bookList.printBooksInfo()
print('-' * 30)
myBookList = bk.BookRepository()
myBookList.registBook(bk.Book('php', 18000, '121567890'))
myBookList.registBook(bk.Book('html', 22000, '43289765'))
myBookList.registBook(bk.Book('ruby', 33000, '1224577698'))
myBookList.printBookInfo('121567890')
myBookList.printBooksInfo()
print('-' * 30)
myBookList.removeBook('43289765')
myBookList.printBooksInfo()
#출력
------------------------------
python, 20000, 1234567890
java, 25000, 43218765
c++, 27000, 12387698
python, 20000, 1234567890
c++, 27000, 12387698
------------------------------
java, 25000, 43218765
c++, 27000, 12387698
------------------------------
php, 18000, 121567890
php, 18000, 121567890
html, 22000, 43289765
ruby, 33000, 1224577698
------------------------------
php, 18000, 121567890
ruby, 33000, 1224577698
💡딕셔너리를 선언해서 담아주는 것이 아직도 서툴다.. 계속 어떻게 하더라? 하다가 결국에는 강의를 듣고 풀었다.
#추상클래스 dictionary.py 파일
from abc import ABCMeta
from abc import abstractmethod
class AbsDictionary(metaclass=ABCMeta):
def __init__(self):
self.wordDic = {}
@abstractmethod
def registWord(self, w1, w2):
pass
@abstractmethod
def updateWord(self, w1, w2):
pass
@abstractmethod
def removeWord(self, w1):
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 updateWord(self, w1, w2):
print(f'[KorToEng] updateWord(): {w1} to {w2}')
self.wordDic[w1] = w2
def removeWord(self, w1):
print(f'[KorToEng] removeWord(): {w1}')
del self.wordDic[w1]
def searchWord(self, w1):
print(f'[KorToEng] searchWord(): {w1}')
return self.wordDic[w1]
def printWords(self):
for wordKey in self.wordDic.keys():
print(f'{wordKey} : {self.wordDic[wordKey]}')
class KorToJpn(AbsDictionary):
def __init__(self):
super().__init__()
def registWord(self, w1, w2):
print(f'[KorToJpn] registWord(): {w1} to {w2}')
self.wordDic[w1] = w2
def updadteWord(self, w1, w2):
print(f'[KorToJpn] updateWord(): {w1} to {w2}')
self.wordDic[w1] = w2
def updateWord(self, w1):
print(f'[KorToJpn] removeWord(): {w1}')
del self.wordDic[w1]
def searchWord(self, w1):
print(f'[KorToJpn] searchWord(): {w1}')
return self.wordDic[w1]
def printWords(self):
for wordKey in self.wordDic.keys():
print(f'{wordKey} : {self.wordDic[wordKey]}')
#실행파일
import dictionary as dic
kTe = dic.KorToEng()
kTe.registWord('책', 'bok')
kTe.registWord('나비', 'butterfly')
kTe.registWord('연필', 'pencil')
kTe.registWord('학생', 'student')
kTe.registWord('선생님', 'teacher')
kTe.printWords()
print('-' * 30)
kTe.updateWord('책', 'book')
print('-' * 30)
print(f' 연필 : {kTe.searchWord("연필")}')
print(f' 나비 : {kTe.searchWord("나비")}')
print(f' 선생님 : {kTe.searchWord("선생님")}')
print('-' * 30)
kTe.removeWord('학생')
kTe.printWords()
#출력
책 : bok
나비 : butterfly
연필 : pencil
학생 : student
선생님 : teacher
------------------------------
[KorToEng] updateWord(): 책 to book
------------------------------
[KorToEng] searchWord(): 연필
연필 : pencil
[KorToEng] searchWord(): 나비
나비 : butterfly
[KorToEng] searchWord(): 선생님
선생님 : teacher
------------------------------
[KorToEng] removeWord(): 학생
책 : book
나비 : butterfly
연필 : pencil
선생님 : teacher
💡연습을 많이 해봐야 할 것 같다. 아직도 계속 떠듬거리다가 강의를 보았다.
#dice.py 파일
import random as ran
class Dice:
def __init__(self):
self.cNum = 0
self.uNum = 0
def setCnum(self):
print(f'[Dice] setCnum~~')
self.cNum = ran.randint(1,6)
def setUnum(self):
print(f'[Dice] setUnum~~')
self.uNum = ran.randint(1,6)
def startGame(self):
print(f'[Dice] Game Start!!')
self.setCnum()
self.setUnum()
def printResult(self):
print(f'게임 결과는?')
if self.cNum == 0 or self.uNum == 0 :
print('숫자 설정 전 입니다.')
else:
if self.cNum > self.uNum:
print(f'com({self.cNum} VS user({self.uNum})) >>> com Win!!')
elif self.cNum < self.uNum:
print(f'com({self.cNum} VS user({self.uNum})) >>> user Win!!')
elif self.cNum == self.uNum:
print(f'com({self.cNum} VS user({self.uNum})) >>> Draw!!')
# def printResult(self):
# print(f'게임 결과는?')
# if self.cNum == 0 or self.uNum == 0 :
# print('숫자 설정 전 입니다.')
# elif self.cNum > self.uNum:
# print(f'com({self.cNum} VS user({self.uNum})) >>> com Win!!')
# elif self.cNum < self.uNum:
# print(f'com({self.cNum} VS user({self.uNum})) >>> user Win!!')
# elif self.cNum == self.uNum:
# print(f'com({self.cNum} VS user({self.uNum})) >>> Draw!!')
#실행파일
import dice
game = dice.Dice()
game.startGame()
game.printResult()
#출력
[Dice] Game Start!!
[Dice] setCnum~~
[Dice] setUnum~~
게임 결과는?
com(4 VS user(4)) >>> Draw!!
💡printResult()를 쓰고나서 강의와 비교해보니, 나는 모든 조건을 한번에 걸었는데 강사님께서는 if~else로 나누어서 필요한 조건만 확인한 후 출력하셨다. 게임성사가 되지 않을 시 따로 빼두는 것이 조건간에 상호작용이 없어지니.. 그 방법이 더 좋다고 한다.
#car.py 파일
import random as ran
class Car:
def __init__(self, n= 'fire car', c= 'red', s= 200):
self.name = n
self.color = c
self.maxSpeed = s
self.distance = 0
def printCarInfo(self):
print(f'{self.name}, {self.color}, {self.maxSpeed}')
def controlSpeed(self):
return ran.randint(0, self.maxSpeed)
def getDistanceForHour(self):
return self.controlSpeed() * 1
#racing.py 파일
from time import sleep
class CarRacing:
def __init__(self):
self.cars = []
self.ranking = []
def startRacing(self):
print('Racing Start!!')
for index in range(10):
print(f'Racing : {index+1}바퀴')
for carIndex in self.cars:
carIndex.distance += carIndex.getDistanceForHour()
sleep(1)
self.printCurrentCarDistance()
def printCurrentCarDistance(self):
for carIndex in self.cars:
print(f'{carIndex.name} : {carIndex.distance}\t\t', end='')
print()
def addCar(self, c):
self.cars.append(c)
#실행파일
from car_game import car
from car_game import racing as rc
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()
#출력
Racing Start!!
Racing : 1바퀴
Car01 : 244 Car02 : 8 Car03 : 180 Car04 : 132 Car05 : 55
Racing : 2바퀴
Car01 : 259 Car02 : 16 Car03 : 397 Car04 : 353 Car05 : 79
Racing : 3바퀴
Car01 : 494 Car02 : 93 Car03 : 440 Car04 : 482 Car05 : 106
Racing : 4바퀴
Car01 : 607 Car02 : 259 Car03 : 482 Car04 : 754 Car05 : 200
Racing : 5바퀴
Car01 : 725 Car02 : 289 Car03 : 632 Car04 : 938 Car05 : 327
Racing : 6바퀴
Car01 : 765 Car02 : 416 Car03 : 648 Car04 : 966 Car05 : 402
Racing : 7바퀴
Car01 : 948 Car02 : 570 Car03 : 651 Car04 : 1114 Car05 : 542
Racing : 8바퀴
Car01 : 1009 Car02 : 574 Car03 : 695 Car04 : 1239 Car05 : 543
Racing : 9바퀴
Car01 : 1066 Car02 : 575 Car03 : 715 Car04 : 1385 Car05 : 672
Racing : 10바퀴
Car01 : 1279 Car02 : 677 Car03 : 724 Car04 : 1511 Car05 : 701
💡스스로 절반도 작성하지 못했다. 아직 문제를 보고 어떤 식으로 접근해야하는가를 명확히 파악하지 못하는 것 같다.. racing 모듈에서 레이싱게임을 어떤 식으로 진행해야 하는지, 거리를 어떤 식으로 더해줄 지 떠올리지 못했다.
#mp3player.py
from time import sleep
import random as ran
class Song:
def __init__(self, t, s, pt):
self.title = t
self.singer = s
self.play_time = pt
def printSongInfo(self):
print(f'Title : {self.title}, Singer : {self.singer}, Play time : {self.play_time}')
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 songIndex in self.songList:
print(f'Title : {songIndex.title} / Singer : {songIndex.singer} / Play time : {songIndex.play_time}sec')
sleep(songIndex.play_time)
else:
for songIndex in self.songList:
print(f'Title : {songIndex.title} / Singer : {songIndex.singer} / Play time : {songIndex.play_time}sec')
sleep(songIndex.play_time)
def shuffle(self):
ran.shuffle(self.songList)
def setIsLoop(self, flag):
self.isLoop = flag
#실행파일
import mp3player as mp3
song1 = mp3.Song('신호등', '이무진', 3)
song2 = mp3.Song('Permission', 'BTS', 4)
song3 = mp3.Song('Butter', 'BTS', 2)
song4 = mp3.Song('Weekend', 'TAEYEON', 5)
song5 = mp3.Song('좋아좋아', '조정석', 4)
player = mp3.Player()
player.addSong(song1)
player.addSong(song2)
player.addSong(song3)
player.addSong(song4)
player.addSong(song5)
player.setIsLoop(False)
player.shuffle()
player.play()
#출력
Title : Butter / Singer : BTS / Play time : 2sec
Title : Permission / Singer : BTS / Play time : 4sec
Title : 좋아좋아 / Singer : 조정석 / Play time : 4sec
Title : 신호등 / Singer : 이무진 / Play time : 3sec
Title : Weekend / Singer : TAEYEON / Play time : 5sec
💡random 모듈에 shuffle이라는 함수를 알게 되었고, isLoop이라는 변수를 while에 조건을 주어 무한루프(전체다시듣기)를 처리하는 것이 핵심이었다.