파이썬 중급 문제풀이

조지원·2023년 5월 21일
0

python

목록 보기
10/15


💻 keep going

아무 생각 말고 그냥 하자!


💡 클래스 01

⌨ 클래스

class Member:
     def __init__(self, i, p):
         self.id = i
         self.pw = p




class MemberRepository:                       # 모여서 관리를 하는 class

    def __init__(self):                       # __init__ -> 생성자, 속성 / 아래부터는 다 기능
        self.members = {}                     # {}(딕셔너리)에는 키값 과 벨류값이 들어간다.
                                              # 회원의 id가 키값이 되고, 사용자의 전체 정보가 벨류값이 된다.
    def addMember(self, m):                   # m 은 class Member에서 만들어진 회원객체
        self.members[m.id] = m.pw             # 키값 : id      벨류값 : 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]                    # del : 내장키워드 - 변수나 객체를 삭제

    def printMembers(self):                    # 전체 멤버를 출력
        for mk in self.members.keys():         # .key() : 딕셔너리에서 모든 key값 출력
            print(f"ID : {mk}")                # mk는 회원의 ID를 나타내는 문자열
            print(f"PW : {self.members[mk]}")  # 파이썬 중급 문제풀이 메모장 01

문제 :

회원가입 클래스와 회원정보를 관리하는 클래스를 만들고 회원가입 로그인 기능을 구현해보자

import 클래스01 as mb

mems = mb.MemberRepository()

for i in range(1):     # 1명의 정보 입력 받기
    mId = input("아이디 입력 : ")
    mPw = input("비밀번호 입력 : ")
    mem = mb.Member(mId, mPw)
    mems.addMember(mem)


mems. loginMember("abcd", "1234")

mems. removeMember("abcd", "1234")

mems.printMembers()

🔥 결과 :

아이디 입력 : abcd
비밀번호 입력 : 1234
abcd : log-in success!!


💡 클래스 02

⌨ 클래스

class NormalTv:
    def __init__(self, i=32, c="black", r="full-HD"):            # 속성
        self.inch = i
        self.color = c
        self.resolution = r
        self.smartTv = "off"                                     # 일반 tv이기 때문에 smart,ai 기능 없음
        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}")
        print(f"color : {self.color}")
        print(f"resolution : {self.resolution}")
        print(f"smartTv : {self.smartTv}")
        print(f"aiTv : {self.aiTv}")


class Tv4k(NormalTv):                                           # 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

문제 :

TV클래스를 다음과 같은 상속 구조로 만들고 객체를 생성

import 클래스02 as st

my4kTv = st.Tv4k("65", "silver", "4k")
my4kTv.setSmartTv("on")
my4kTv.printTvInfo()
my4kTv.turnOn()
my4kTv.turnOff()
print()
friend4kTv = st.Tv4k("55", "white", "4k")
friend4kTv.setSmartTv("off")
friend4kTv.printTvInfo()
friend4kTv.turnOn()
friend4kTv.turnOff()
print()
my8kTv = st.Tv8k("75", "black", "8k")
my8kTv.setSmartTv("on")
my8kTv.setAiTv("on")
my8kTv.printTvInfo()
my8kTv.turnOn()
my8kTv.turnOff()

🔥 결과 :

inch : 65
color : silver
resolution : 4k
smartTv : on
aiTv : off
TV power on!!
TV power off!!

inch : 55
color : white
resolution : 4k
smartTv : off
aiTv : off
TV power on!!
TV power off!!

inch : 75
color : black
resolution : 8k
smartTv : on
aiTv : on
TV power on!!
TV power off!!


💡 클래스 03

⌨ 클래스

# 클래스가 같은 파일 안에 있으면, 하나의 모듈 안에 있는 클래스들은 서로 import 없이도 사용가능.

# 따라서  Book 클래스와 BookRepository 클래스는 모두 같은 모듈 안에 있기 때문에 BookRepository 클래스에서 Book 클래스의 객체를 사용할 수 있다.

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):        # 책 한권이 들어오면 bDic에 저장
        self.bDic[b.bIsbn] = b      # 키값 : isbn
                                    # [b.isbn] 뜻 : Book 객체 "b"의 "isbn" 속성 값을 BookRepository 클래스 내에서 저장하는 것

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

문제 :

명세서를 참고해서 도서 관리 프로그램을 만들자

import 클래스03 as bk

myBRepository = bk.BookRepository()

myBRepository.registBook(bk.Book("python" , 20000, "1234567890"))
myBRepository.registBook(bk.Book("java" , 25000, "4536323423"))
myBRepository.registBook(bk.Book("c/c++" , 27000, "98739857"))




myBRepository.removeBook("4536323423")

myBRepository.printBooksinfo()

🔥 결과 :

python,20000, 1234567890
c/c++,27000, 98739857


💡 클래스 04

⌨ 클래스

from abc import ABCMeta
from abc import abstractmethod


class AbsDictionar(metaclass=ABCMeta):

    def __init__(self):
        self.wordDic = {}
    @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(AbsDictionar):         # 상속을 받았기 때문에 @abstractmethod 반드시 구현해야함
    def __init__(self):
        super().__init__()


    def registWord(self, w1, w2):
        print(f"[KorToEng] registWord() : {w1} to {w2}")
        self.wordDic[w1] = [w2]       # 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]}")




class KorToJap(AbsDictionar):
    def __init__(self):
        super().__init__()


    def registWord(self, w1, w2):
        print(f"[KorToJap] registWord() : {w1} to {w2}")
        self.wordDic[w1] = [w2]

    def removeWord(self, w1):
        print(f"[KorToJap] removeWord() : {w1}")
        del self.wordDic[w1]


    def updateWord(self, w1, w2):
        print(f"[KorToJap] updateWord() : {w1} to {w2}")
        self.wordDic[w1] = [w2]


    def searchWord(self, w1):
        print(f"[KorToJap] searchWord() : {w1}")
        return self.wordDic[w1]

    def printWords(self):
        for k in self.wordDic.keys():
            print(f"{k} : {self.wordDic[k]}")

문제 :

추상 클래스를 이용해서 한/영, 한/일 사전 클래스 만들기

import 클래스04 as dic

kTe = dic.KorToEng()

kTe.registWord("책", "bok")
kTe.registWord("나비", "butterfly")
kTe.registWord("연필", "pencil")
kTe.registWord("학생", "student")
kTe.registWord("선생님", "teacher")
print()
kTe.printWords()
print()
kTe.updateWord("책", "book")

kTe.printWords()
print()
print(f"책 : {kTe.searchWord('책')}")

kTe.removeWord("책")
kTe.printWords()
print()
print()
kTj = dic.KorToJap()

kTj.registWord("밥", "つゆ")
kTj.registWord("국물", "つゆ")

kTj.printWords()
print()
kTj.updateWord("밥", "ご飯")

kTj.printWords()

print(f" 밥 : {kTj.searchWord('밥')}")
print()
kTj.printWords()
print()
kTj.removeWord("국물")

kTj.printWords()

🔥 결과 :

[KorToEng] registWord() : 책 to bok
[KorToEng] registWord() : 나비 to butterfly
[KorToEng] registWord() : 연필 to pencil
[KorToEng] registWord() : 학생 to student
[KorToEng] registWord() : 선생님 to teacher

책 : ['bok']
나비 : ['butterfly']
연필 : ['pencil']
학생 : ['student']
선생님 : ['teacher']

[KorToEng] updateWord() : 책 to book
책 : ['book']
나비 : ['butterfly']
연필 : ['pencil']
학생 : ['student']
선생님 : ['teacher']

[KorToEng] searchWord() : 책
책 : ['book']
[KorToEng] removeWord() : 책
나비 : ['butterfly']
연필 : ['pencil']
학생 : ['student']
선생님 : ['teacher']


[KorToJap] registWord() : 밥 to つゆ
[KorToJap] registWord() : 국물 to つゆ
밥 : ['つゆ']
국물 : ['つゆ']

[KorToJap] updateWord() : 밥 to ご飯
밥 : ['ご飯']
국물 : ['つゆ']
[KorToJap] searchWord() : 밥
 밥 : ['ご飯']: ['ご飯']
국물 : ['つゆ']

[KorToJap] removeWord() : 국물
밥 : ['ご飯']


💡 클래스 05

⌨ 클래스

import random as rd

class Dice:

    def __init__(self):
        self.cNum = 0
        self.uNum = 0

    def setCnum(self):
        print("[Dice] setCnum()")
        self.cNum = rd.randint(1, 6)
        print(f"결과 : {self.cNum}")

    def setUnum(self):
        print("[Dice] setUnum()")
        self.uNum = rd.randint(1, 6)
        print(f"결과 : {self.uNum}")
    def starGame(self):
        print("[Dice] startGame()")

        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} >>  무승부")

문제 :

주사위 게임 클래스를 만들고 컴퓨터와 사용자의 게임 결과 출력

import 클래스05 as dice

dc = dice.Dice()
dc.starGame()
dc.printResult()

🔥 결과 :

[Dice] startGame()
[Dice] setCnum()
결과 : 6
[Dice] setUnum()
결과 : 1
[Dice] printResult()
 컴퓨터vs유저 : 6 vs 1 >> 컴퓨터 승


💡 클래스 06

⌨ 클래스1

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

⌨ 클래스2

from time import sleep   # 잠시 멈추는 기능

class CarRacing:

    def __init__(self):
        self.cars = []
        self.rankings = []


    def startRacing(self):
        for i in range(10):    # 10바퀴
            print(f"Racing : {i+1}바퀴")
            for car in self.cars:
                car.distance += car.getDistanceForHour()

            sleep(1)       # 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)

문제 :

자동차 경주게임 클래스 만들기

(자동차는 랜덤하게 이동하며, 편의상 10초 동안 주행한다고 할 때 가장 멀리 이동한 자동차가 우승)

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 : 1바퀴
Car01: 30		Car02: 38		Car03: 113		Car04: 26		Car05: 6		
Racing : 2바퀴
Car01: 202		Car02: 119		Car03: 180		Car04: 49		Car05: 126		
Racing : 3바퀴
Car01: 415		Car02: 120		Car03: 383		Car04: 273		Car05: 217		
Racing : 4바퀴
Car01: 458		Car02: 200		Car03: 472		Car04: 521		Car05: 312		
Racing : 5바퀴
Car01: 628		Car02: 256		Car03: 480		Car04: 523		Car05: 415		
Racing : 6바퀴
Car01: 687		Car02: 442		Car03: 502		Car04: 755		Car05: 479		
Racing : 7바퀴
Car01: 895		Car02: 455		Car03: 502		Car04: 863		Car05: 596		
Racing : 8바퀴
Car01: 994		Car02: 540		Car03: 537		Car04: 884		Car05: 670		
Racing : 9바퀴
Car01: 1083		Car02: 620		Car03: 541		Car04: 1066		Car05: 742		
Racing : 10바퀴
Car01: 1181		Car02: 801		Car03: 610		Car04: 1314		Car05: 771


💡 클래스 07

⌨ 클래스

from time import sleep        # sleep 기능을 사용하기 위해
import random                 # shuffle 기능을 사용하기 위해

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:                         # 반복재생이 True 라면
            while self.isLoop:                  # 반복재생이 True인 동안
                for s in self.songList:         # for문이 계속 돈다  ex) 10곡이라면 끝나고 또다시 10곡 while문이 무한루프에 빠졌기 때문에
                    print(f"Title : {s.title}, Singer : {s.singer}, PlayTime : {s.playTime}sec")
                    sleep(s.playTime)           # 재생하고있는 곡의 playTime까지 기능 정지


        else :                                  # 반복재생이 Flase 라면  10곡 후 프로그램 종료
            for s in self.songList:
                print(f"Title : {s.title}, Singer : {s.singer}, PlayTime : {s.playTime}sec")
                sleep(s.playTime)


    def shuffle(self):
        random.shuffle(self.songList)

    def setIsLoop(self, flag):                  # 반복재생을 True or Flase 로 결정
        self.isLoop = flag

문제 :

mp3 플레이어 클래스를 만들고 노래 등록 후 재생

import mp3player as mp3

s1 = mp3.Song("신호등", "이무진", 3)
s2 = mp3.Song("random1", "조지", 6)
s3 = mp3.Song("random2", "조지1", 2)
s4 = mp3.Song("random3", "조지2", 7)
s5 = mp3.Song("random4", "조지3", 5)

player = mp3.Player()
# 노래 추가
player.addSong(s1)
player.addSong(s2)
player.addSong(s3)
player.addSong(s4)
player.addSong(s5)
# 반복 재생 안 함
player.setIsLoop(False)
# 노래 섞음
player.shuffle()

player.play()

🔥 결과 :

Title : random3, Singer : 조지2, PlayTime : 7sec
Title : 신호등, Singer : 이무진, PlayTime : 3sec
Title : random1, Singer : 조지, PlayTime : 6sec
Title : random4, Singer : 조지3, PlayTime : 5sec
Title : random2, Singer : 조지1, PlayTime : 2sec


profile
keep going

0개의 댓글