Coding Test/초보자를 위한 파이썬 300제

[독학 파이썬] 초보자를 위한 파이썬 300제 풀이(271~280)_12.23

Klay_J 2022. 12. 23. 16:35

안녕하세요. Harry입니다.

 

현재 풀이중인 초보자를 위한 파이썬 300제 풀이를 진행하면서 나름대로 파악했던 문제 출제 의도와 풀이를 작성했습니다.

모든 풀이는 직접 Pycharm을 통해 에러없이 출력됨을 확인 후 작성했습니다.

 

초보자를 위한 파이썬 300제 풀이는 Wikidocs에 무료로 배포된 전자책을 활용했습니다/

https://wikidocs.net/book/922

[학습목표]

1. 각 문제별 요구하는 역량(출제의도)이 무엇인지 파악할 수 있다.

2. 각 문제별 요구하는 기술 및 기능을 활용하여 문제를 해결할 수 있다.

271 ~ 280

271 Account 클래스

은행에 가서 계좌를 개설하면 은행이름, 예금주, 계좌번호, 잔액이 설정됩니다. Account 클래스를 생성한 후 생성자를 구현해보세요. 생성자에서는 예금주와 초기 잔액만 입력 받습니다. 은행이름은 SC은행으로 계좌번호는 3자리-2자리-6자리 형태로 랜덤하게 생성됩니다. 

-요구역량 : random 모듈 및 random 메서드를 활용하여 class의 기능을 정의할 수 있는가?

 

저는 아래 4가지를 몰랐습니다.

 

- 함수의 매개변수에 없어도 self.bank = 'SC은행' 이라 고정할 수 있다.

- random 모듈의 random() 함수를 호출.random() 함수는 0 이상 1 미만의 숫자 중에서 랜덤으로 하나 뽑아서 출력합니다.

- random.randint(a,b) = a부터 b 사이에 균일한 정수 난수를 발생시키는 메서드입니다.

- 문자열.zfill(num) = (문자열 개수 + 문자열 앞에 붙일 0 개수) = num 되는 메서드입니다

   중요한 num = 출력할 문자열의 개수입니다.

        ex) "50".zfill(3) = "050" , "50".zfill(2) = "50" (이미 문자열 개수 2 충족됐으므로 0 추가 없이 그대로 출력)

은행이름: SC은행
계좌번호: 111-11-111111
 정답확인
import random

class Account:
    def __init__(self,name,balance):
        self.name = name
        self.balance = balance
        self.bank = 'SC은행'
        num1 = random.randint(0, 999)
        num2 = random.randint(0, 99)
        num3 = random.randint(0, 999999)

        num1 = str(num1).zfill(3)      # 1 -> '1' -> '001'
        num2 = str(num2).zfill(2)      # 1 -> '1' -> '01'
        num3 = str(num3).zfill(6)      # 1 -> '1' -> '0000001'
        self.account_number = num1 + '-' + num2 + '-' + num3  # 001-01-000001

kim = Account("김민수", 100)
print(kim.name)
print(kim.balance)
print(kim.bank)
print(kim.account_number)

272 클래스 변수

클래스 변수를 사용해서 Account 클래스로부터 생성된 계좌 객체의 개수를 저장하세요. 

- 요구역량 : 클래스 내에서 함수가 몇번 실행됐는지 개수를 측정할 수 있는가?

 

 정답확인
class Account:
    # class variable
    account_count = 0

    def __init__(self, name, balance):
        self.name = name
        self.balance = balance
        self.bank = "SC은행"

        num1 = random.randint(0, 999)
        num2 = random.randint(0, 99)
        num3 = random.randint(0, 999999)

        num1 = str(num1).zfill(3)      # 1 -> '1' -> '001'
        num2 = str(num2).zfill(2)      # 1 -> '1' -> '01'
        num3 = str(num3).zfill(6)      # 1 -> '1' -> '0000001'
        self.account_number = num1 + '-' + num2 + '-' + num3  # 001-01-000001

        Account.account_count += 1


kim = Account("김민수", 100)
print(Account.account_count)
lee = Account("이민수", 100)
print(Account.account_count)

273 클래스 변수 출력

Account 클래스로부터 생성된 계좌의 개수를 출력하는 get_account_num() 메서드를 추가하세요. 

- 요구역량 : 같은 클래스 내 타 함수가 실행된 횟수를 출력하는 함수를 정의할 수 있는가?

 

- def 함수(cls) : 괄호 안에 self 대신 cls 들어갈 있다는 것을 몰랐습니다.

instance 매소드를 사용하려면 self 키워드를 사용하고, class 매소드를 사용하려면 cls 키워드를 사용해야합니다.

또한 cls 키워드를 활용하려면 앞에 @classmethod 명시해줘야 합니다.

 

 정답확인
import random

class Account:
    # class variable
    account_count = 0

    def __init__(self, name, balance):
        self.name = name
        self.balance = balance
        self.bank = "SC은행"

        # 3-2-6
        num1 = random.randint(0, 999)
        num2 = random.randint(0, 99)
        num3 = random.randint(0, 999999)

        num1 = str(num1).zfill(3)      # 1 -> '1' -> '001'
        num2 = str(num2).zfill(2)      # 1 -> '1' -> '01'
        num3 = str(num3).zfill(6)      # 1 -> '1' -> '0000001'
        self.account_number = num1 + '-' + num2 + '-' + num3  # 001-01-000001
        Account.account_count +=1

    @classmethod
    def get_account_num(cls):
        print(cls.account_count)     # Account.account_count


kim = Account("김민수", 100)
lee = Account("이민수", 100)
kim.get_account_num()

274 입금 메서드

Account 클래스에 입금을 위한 deposit 메서드를 추가하세요. 입금은 최소 1원 이상만 가능합니다. 

- 요구역량 : 클래스 내 a += b를 활용하여 메서드를 활용할 수 있는가?

보통의 함수 내 명령을 정의할 때는 a+=b로 작성하나, 클래스 내 메서드의 기능을 정의할 때는 self.a += b로 작성해야한다?

 

 정답확인
import random

class Account:
    # class variable
    account_count = 0

    def __init__(self, name, balance):
        self.name = name
        self.balance = balance
        self.bank = "SC은행"

        # 3-2-6
        num1 = random.randint(0, 999)
        num2 = random.randint(0, 99)
        num3 = random.randint(0, 999999)

        num1 = str(num1).zfill(3)      # 1 -> '1' -> '001'
        num2 = str(num2).zfill(2)      # 1 -> '1' -> '01'
        num3 = str(num3).zfill(6)      # 1 -> '1' -> '0000001'
        self.account_number = num1 + '-' + num2 + '-' + num3  # 001-01-000001
        Account.account_count +=1

    @classmethod
    def get_account_num(cls):
        print(cls.account_count)     # Account.account_count

    def deposit(self, amount):
        if amount >= 1:
            self.balance += amount

275 출금 메서드

Account 클래스에 출금을 위한 withdraw 메서드를 추가하세요. 출금은 계좌의 잔고 이상으로 출금할 수는 없습니다. 

- 요구역량 : 클래스 내 a += b를 활용하여 메서드를 활용할 수 있는가?

 

 정답확인
import random

class Account:
    # class variable
    account_count = 0

    def __init__(self, name, balance):
        self.name = name
        self.balance = balance
        self.bank = "SC은행"

        num1 = random.randint(0, 999)
        num2 = random.randint(0, 99)
        num3 = random.randint(0, 999999)

        num1 = str(num1).zfill(3)      # 1 -> '1' -> '001'
        num2 = str(num2).zfill(2)      # 1 -> '1' -> '01'
        num3 = str(num3).zfill(6)      # 1 -> '1' -> '0000001'
        self.account_number = num1 + '-' + num2 + '-' + num3  # 001-01-000001
        Account.account_count += 1

    def get_account_num(cls):
        print(cls.account_count)

    def deposit(self,amount):
        if amount > 1:
            self.balance += amount

    def withdraw(self,withdrawal):
        if self.balance > withdrawal :
            self.balance -= withdrawal

276 정보 출력 메서드

Account 인스턴스에 저장된 정보를 출력하는 display_info() 메서드를 추가하세요. 잔고는 세자리마다 쉼표를 출력하세요. 

- 요구역량 : 클래스 내 메서드를 정의하여 타 메서드에서 출력하는 결과값을 한번에 출력하는 메서드를 생성할 수 있는가?

은행이름: SC은행
예금주: 파이썬
계좌번호: 111-11-111111
잔고: 10,000원
 정답확인
import random

class Account:
    # class variable
    account_count = 0

    def __init__(self, name, balance):
        self.name = name
        self.balance = balance
        self.bank = "SC은행"

        num1 = random.randint(0, 999)
        num2 = random.randint(0, 99)
        num3 = random.randint(0, 999999)

        num1 = str(num1).zfill(3)      # 1 -> '1' -> '001'
        num2 = str(num2).zfill(2)      # 1 -> '1' -> '01'
        num3 = str(num3).zfill(6)      # 1 -> '1' -> '0000001'
        self.account_number = num1 + '-' + num2 + '-' + num3  # 001-01-000001
        Account.account_count += 1

    def get_account_num(cls):
        print(cls.account_count)

    def deposit(self,amount):
        if amount > 1:
            self.balance += amount

    def withdraw(self,withdrawal):
        if self.balance > withdrawal :
            self.balance -= withdrawal

    def display_info(self):
        print("은행이름: ", self.bank)
        print("예금주: ", self.name)
        print("계좌번호: ", self.account_number)
        print("잔고: ", f"{self.balance:,}")

277 이자 지급하기

입금 횟수가 5회가 될 때 잔고를 기준으로 1%의 이자가 잔고에 추가되도록 코드를 변경해보세요. 

- 요구역량 : 특정 메서드를 변경하여 추가 기능을 삽입할 수 있는가?

 

 정답확인
import random

class Account:
    # class variable
    account_count = 0

    def __init__(self, name, balance):
        self.name = name
        self.balance = balance
        self.bank = "SC은행"

        num1 = random.randint(0, 999)
        num2 = random.randint(0, 99)
        num3 = random.randint(0, 999999)

        num1 = str(num1).zfill(3)      # 1 -> '1' -> '001'
        num2 = str(num2).zfill(2)      # 1 -> '1' -> '01'
        num3 = str(num3).zfill(6)      # 1 -> '1' -> '0000001'
        self.account_number = num1 + '-' + num2 + '-' + num3  # 001-01-000001
        Account.account_count += 1

    def get_account_num(cls):
        print(cls.account_count)

    def deposit(self,amount):
        if amount > 1:
            self.balance += amount
            
            self.deposit_count +=1
            if self.deposit_count%5 == 0:
                self.balance = self.balance*1.01

    def withdraw(self,withdrawal):
        if self.balance > withdrawal :
            self.balance -= withdrawal

    def display_info(self):
        print("은행이름: ", self.bank)
        print("예금주: ", self.name)
        print("계좌번호: ", self.account_number)
        print("잔고: ", f"{self.balance:,}")

278 여러 객체 생성

Account 클래스로부터 3개 이상 인스턴스를 생성하고 생성된 인스턴스를 리스트에 저장해보세요. 

- 인스턴스의 생성 결과를 리스트로 묶을 수 있는가?

 

 정답확인
data = []
k = Account("KIM", 10000000)
l = Account("LEE", 10000)
p = Account("PARK", 10000)

data.append(k)
data.append(l)
data.append(p)

print(data)

279 객체 순회

반복문을 통해 리스트에 있는 객체를 순회하면서 잔고가 100만원 이상인 고객의 정보만 출력하세요. 

- 요구역량 : 클래스 실행 결과를 조건에 따라 일부만 출력할 수 있는가?

 

 정답확인
data = []
k = Account("KIM", 10000000)
l = Account("LEE", 10000)
p = Account("PARK", 10000)
data.append(k)
data.append(l)
data.append(p)

for i in data:
    if i.balance >= 1000000:
        i.display_info()

280 입출금 내역

입금과 출금 내역이 기록되도록 코드를 업데이트 하세요. 입금 내역과 출금 내역을 출력하는 deposit_history와 withdraw_history 메서드를 추가하세요. 

- 요구역량 : 특정 기능을 클래스 내 메서드로 추가할 수 있는가?

 정답확인
import random

class Account:
    # class variable
    account_count = 0

    def __init__(self, name, balance):
        self.name = name
        self.balance = balance
        self.bank = "SC은행"

        num1 = random.randint(0, 999)
        num2 = random.randint(0, 99)
        num3 = random.randint(0, 999999)

        num1 = str(num1).zfill(3)      # 1 -> '1' -> '001'
        num2 = str(num2).zfill(2)      # 1 -> '1' -> '01'
        num3 = str(num3).zfill(6)      # 1 -> '1' -> '0000001'
        self.account_number = num1 + '-' + num2 + '-' + num3  # 001-01-000001
        Account.account_count += 1

    def get_account_num(cls):
        print(cls.account_count)

    def deposit(self,amount):
        if amount > 1:
            self.balance += amount

            self.deposit_count +=1
            if self.deposit_count%5 == 0:
                self.balance = self.balance*1.01

    def withdraw(self,withdrawal):
        if self.balance > withdrawal :
            self.balance -= withdrawal

    def display_info(self):
        print("은행이름: ", self.bank)
        print("예금주: ", self.name)
        print("계좌번호: ", self.account_number)
        print("잔고: ", f"{self.balance:,}")

    def withdraw_history(self):
        for amount in self.withdraw_log:
            print(amount)

    def deposit_history(self):
        for amount in self.deposit_log:
            print(amount)

클래스는 여전히 헷갈리는게 많네요..

 

감사합니다.