세조목

PYTHON 정리(개인과제 오답 풀이)(24.01.10) 본문

데이터 분석 공부/Python

PYTHON 정리(개인과제 오답 풀이)(24.01.10)

세조목 2024. 1. 10. 11:19

Python 개인과제 오답 풀이

Q.2

# 출제자의 의도
1. 문자열 처리방법을 알아내고, 메소드를 활용
  ● str.split
2. domain에 .이 있는 것을 확인하는 방법
  ● in
3. 문제 설명에 따르면 .com도 옳은 도메인으로 판단
4. (Advanced)re모듈의 정규표현식을 이용해 판단할수도 있다.
email_list = [
        "example@example.com",
        "wrongemail@.com",
        "anotherexample.com",
        "correct@email.co.uk"
    ]

for email in email_list:
    split_list = email.split('@')
    if len(split_list) == 1:
        print(f'{email}은 유효하지 않은 이메일입니다.')
        
    else:
        if '.' in split_list[1]:
            print(f'{email}은 유효한 이메일입니다.')

 

내가 놓친 부분

1. 두번째 이메일도 나는 유효하지 않다고 나오게끔 코드를 작성했다.

elif '@.' in i:
    print(f'{i}는 유효하지 않은 이메일 주소입니다.')
  • 상식적으로는 '@.com'이 올바른 도메인은 아니지만 문제에서는 '도메인명은 '.'을 포함한 하나 이상의 문자로 구성되어야 합니다.'라는 부분이 있었기 때문에 'wrongemail@.com' 도 유효한 이메일이 된다(아래 이미지 참고).
  • 바로 위에 있는 코드는 내가 작성한 코드로, '@.'를 가지고 있는 element는 유효하지 않다고 출력되게끔 해버렸다.

wrongemail@.com 도 유효한 이메일로 표현해야한다는 것을 알려주고 있는 부분

 

 

2. split 메소드를 활용한 문자열 처리방법을 확인하고자 했는데 나는 split 메소드를 활용하지 않고

    '@'가 element에 있는지 없는지를 확인했음

for email in email_list:
    split_list = email.split('@')
    if len(split_list) == 1:
        print(f'{email}은 유효하지 않은 이메일입니다.')

    else:
        if '.' in split_list[1]:
            print(f'{email}은 유효한 이메일입니다.')

위 코드는 정답 코드로 split 메소드를 활용해서 하나의 도메인을 두 개로 나눠서(split해서) 리스트의 전체 길이가 2가 되도록 만든 것을 알 수 있다.

 

def validate_emails(email_list):
    for i in email_list:
        if '@' not in i:
            print(f'{i}는 유효하지 않은 이메일 주소입니다.')
        elif '@.' in i:
            print(f'{i}는 유효하지 않은 이메일 주소입니다.')
        else:
            print(f'{i}는 유효한 이메일 주소입니다.')

그러나 나의 경우 위 코드에서 확인할수 있는것처럼 '@', '@.'이 email_list의 원소에 들어있는지 없는지를 하나씩 확인하는 코드를 작성했다.

 

Q.3

# 출제자의 의도
1. 단순한 반복문과 조건문을 통해 체크할 수 있다.
2. 자료를 적절히 선정해야한다. 자료형의 중요성
    - set자료형을 통해 쉽게 접근하려고 했다면 lisa의 동명이인의 등장으로 원활하게 구현하기 어려울 수 있다.
    - disctionary를 통해 count할 수 있다.
    - (Advanced)Counter Module을 이용해 구현할 수도 있다.

 

튜터님 답안

participant = ["mike", "lisa", "tom", "lisa"]
completion = ["tom", "mike", "lisa"]

def find_non_completer(participant, completion):
    my_dict = {}
    for name in participant:
        my_dict[name] = my_dict.get(name, 0) + 1

    for name2 in completion:
        my_dict[name2] = my_dict[name2] - 1

    for name3 in my_dict:
        if my_dict[name3] == 1:
            print(name3)

find_non_completer(participant, completion)

 

나의 답안

def find_non_completer(participant, completion):
    for i in completion:
        for j in participant:
            if i == j:
                participant.remove(j)
    print(participant)


participant = ["mike", "lisa", "tom", "lisa"]
completion = ["tom", "mike", "lisa"]

find_non_completer(participant, completion)

 

정답은 동일하게 나왔으나 출제자의 의도인 dictionary를 통해 count하지는 못했다.

튜터님의 경우 get메소드를 사용하셨는데

get(name, 0)는 딕셔너리에 name에 해당하는 element가 없으면 0을 반환한다는 의미이다.

participant 리스트에 mike, lisa(2번), tom이 있는데

mike의 경우 my_dict 리스트에 존재하지 않기때문에 0이 반환되어 0+1의 결과값인 1이 들어가고

lisa의 경우는 처음 비교할 때는 my_dict 리스트에 존재하지 않으므로 mike와 동일하게 1이 들어가지만

그 다음 lisa가 한 번 더 비교될 때는 my_dict 리스트에 존재하기때문에 lisa의 value인 1에 +1을 해서 2가 들어가게되며

마지막 tom의 경우는 mike의 경우와 동일하다.

 

Q.4

# 출제자의 의도
1. 클래스 개념과 메소드를 생성하는 방법에 대한 이해
2. init 이니셜을 생성하는 것이 기본이나 수준을 고려하여 생략

 

튜터님 답안

class customer():

    def join_customer(self, name, email, point):
        self.name = name
        self.email = email
        self.point = point

    def add_points(self, plus):
        self.point = self.point + plus
        print(f'정상적으로 추가되었습니다. 현재 포인트는 {self.point}입니다.')

    def reduce_points(self, minus):
        if minus > self.point:
            print(f'포인트가 부족합니다. 현재 포인트는 {self.point}입니다.')
        else:
            self.point = self.point - minus
            print(f'정상적으로 차감되었습니다. 현재 포인트는 {self.point}입니다.')

c = customer()
c.join_customer('Alice', 'alice@example.com', 50)
c.add_points(50)
c.reduce_points(20)
c.reduce_points(150)

 

나의 답안

class customer():

    def join_customer(self, name, email, point):
        self.name = name
        self.email = email
        self.point = point

    def add_points(self, plus):
        self.point = self.point + plus
        print(self.point)

    def reduce_points(self, minus):
        self.point = self.point - minus
        print(abs(self.point))

c = customer()
c.join_customer('Alice', 'alice@example.com', 50)
c.add_points(50)
c.reduce_points(20)
c.reduce_points(150)

 

클래스를 활용할 수 있는지를 확인하고자했던 문제였기에

튜터님의 답안과 나의 답안이 큰 차이는 없었지만

튜터님 답안의 경우

'정상적으로 추가되었습니다. 현재 포인트는 ~~점입니다.'

와 같은 안내 메시지를 추가했다는 점에서 나의 답안보다 훨씬 재미있었던 것 같다.