python - (7) 중급 문제풀이2

jun hyeon·2023년 8월 16일

python

목록 보기
20/21

문제 출처는 제로베이스 데이터 스쿨

▶Ex14 클래스[1]

#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

💡함수 만들때 파라미터 넣는 것과 안에서 어떻게 받아줘야하는지 감이 거의 없었다.. 여러번 풀어봐야 할 것 같다.


▶Ex15 클래스[2]

#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를 빼먹었다. 아직 머리에 정리가 완벽히 되지 않은 듯하다


▶Ex16 클래스[3]

#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

💡딕셔너리를 선언해서 담아주는 것이 아직도 서툴다.. 계속 어떻게 하더라? 하다가 결국에는 강의를 듣고 풀었다.


▶Ex17 클래스[4]

#추상클래스 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

💡연습을 많이 해봐야 할 것 같다. 아직도 계속 떠듬거리다가 강의를 보았다.


▶Ex18 클래스[5]

#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로 나누어서 필요한 조건만 확인한 후 출력하셨다. 게임성사가 되지 않을 시 따로 빼두는 것이 조건간에 상호작용이 없어지니.. 그 방법이 더 좋다고 한다.


▶Ex19 클래스[6]

#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 모듈에서 레이싱게임을 어떤 식으로 진행해야 하는지, 거리를 어떤 식으로 더해줄 지 떠올리지 못했다.


▶Ex20 클래스[7]

#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에 조건을 주어 무한루프(전체다시듣기)를 처리하는 것이 핵심이었다.


0개의 댓글