본문 바로가기
TIL

내배캠 TIL 13일차

by ColorConeHead 2024. 1. 5.
반응형

1. 파이썬 개인 과제

1) 제품 제고 관리

     요구사항

1.각 제품의 재고량이 주어진 기준치보다 많은지 적은지를 판단합니다.(동일 고려 x)

    ex) 기준치를 25로 설정한다면 apple, orange는 과잉, banana는 부족입니다.

2. 재고가 부족한 제품과 과잉인 제품의 목록을 출력합니다.

3. 위 내용을 구현한 함수명을 check_inventory 로 작성하세요.

(1) 2에서 목록을 출력하라고 했기 때문에 출력할 리스트를 만들어줬음.

(2) for문에서 각각의 과일 박스에 빗대로 box라고 문자 사용.

(3) 인수로 받은 cut_line미만이면 under에, 초과면 over에 추가.

(4) 출력하라 했으니 print하는데 과잉이든 부족이든 해당 사항이 없을 경우.
     빈 리스트인 '[]'이 출력되는 것이 좀 그래서 삼항연산자를 사용.

(5) return 값은 리스트 그대로.

inventory_data = [
    ['Apple', 30],
    ['Banana', 20],
    ['Orange', 50]
]


def check_inventory(current_inven, cut_line):
    ### 출력용 리스트
    over = []
    under = []
	
    ### 동일은 고려하지 않기로 했으므로 등호는 없음
    for box in current_inven:
        if box[1] < cut_line:
            under.append(box[0])
        elif box[1] > cut_line:
            over.append(box[0])

    print('과잉 :', over if over != [] else '없음')
    print('부족 :', under if under != [] else '없음')


    ### return 값의 형태는 같게 유지하고 싶어서 print에서 삼항연산자 사용
    return over, under

check_inventory(inventory_data, 20)

 

2) 이메일 주소 유효성 검사

     요구사항

1. 각 이메일 주소가 올바른 형식을 갖추고 있는지 검사합니다. (문자열 메소드 사용)

2. 올바른 형식의 이메일 주소인 경우, "유효한 이메일 주소입니다."를 출력합니다.

3. 올바르지 않은 형식의 경우, "유효하지 않은 이메일 주소입니다."를 출력합니다.

4. 위 내용을 구현한 함수명을 validate_emails 로 작성하세요.

문자열의 규칙이여서 re(정규표현식)이 떠올랐지만
특정 문자열을 찾는 것이 아니고
기본 강의에서 벗어낫기 때문에 지양하고 작성했다.

(1) @가 있는지.
(2) @가 있다면 하나만 있는지.
(3) @를 기준으로 id와 domain으로 나눠서 기준 적용.
(4) id는 하나 이상의 문자.
(5) domain은 '.'을 포함한 하나 이상의 문자.
     하지만 domain에서 '.'은 어디까지나 세퍼레이터의 역할이므로.
     코드 각주와 같은 것들은 제외하였다.
(6) [email, 유효 여부] 형태로 result에 저장.
(7) result 출력.
email_list = [
    "example@example.com",
    "wrongemail@.com",
    "anotherexample.com",
    "correct@email.co.uk"
]


def validate_emails(email_list):
    import re

    result = []

    for email in email_list:
        ### @이 있는지
        if '@' in email:
            core = email.split('@')
        ### @이 있으면 하나만 있는지
            if len(core) != 2:
                print(f"{email} : 유효하지 않은 이메일 주소입니다")
                result.append([email, '유효하지 않음'])
        ### 하나만 있으면 @ 앞, 뒷부분을 id와 domain으로 나누어 조건 생각하기
            else:
                id, domain = core[0], core[1]
        ### id는 1글자 이상
                if id == "":
                    print(f"{email} : 유효하지 않은 이메일 주소입니다")
                    result.append([email, '유효하지 않음'])
        ### id가 1글자라면 domain 조건 생각하기
                else:
        ### domain에는 .이 있어야 함
                    if '.' in domain:
                        less = domain.split(".")
                        ### .은 도메인의 세퍼레이터로 사용되어야 하므로
                        ### split(.) 했을 때 ""이 없어야 함
                        if "" in less:
                            print(f"{email} : 유효하지 않은 이메일 주소입니다")
                            result.append([email, '유효하지 않음'])
                        else:
                            print(f"{email} : 유효한 이메일 주소입니다")
                            result.append([email, '유효함'])
                    else:
                        print(f"{email} : 유효하지 않은 이메일 주소입니다")
                        result.append([email, '유효하지 않음'])
        else:
            print(f"{email} : 유효하지 않은 이메일 주소입니다")
            result.append([email, '유효하지 않음'])

    return result

validate_emails(email_list)

 

3) 마라톤 미 완주자 찾기

     요구사항

1. 참가자 명단에서 완주자 명단에 없는 선수를 찾습니다.

    단 참가자 명단에는 동명이인이 있을 수 있습니다.

2. 완주하지 못한 선수의 이름을 반환합니다.

3. 위 내용을 구현한 함수를 find_non_completer 로 작성하세요

동명이인을 어떻게 처리하는 지가 관건이었다.

(1) 미완주자 리스트를 만들고.
(2) 참가자 이름 리스트로 반복문을 돌리는데.
(3) 완주자 리스트에 이름이 있으면 통과.
      통과 시 완주자 이름에서 제외하여 동명이인 문제 해결.
(4) 완주자 리스트에 이름이 없으면 미완주자 리스트에 추가.
(5) 미완주자 리스트 출력.
participant = ["mike", "lisa", "tom", "lisa"]
completion = ["tom", "mike", "lisa"]



def find_non_completer(participant: list, completion: list):
    ### 미완주자 리스트 만들기
    uncompletion = []
    
    
    ### 참가자 이름 중에서
    for name in participant:
        
    ### 완주자에 이름이 있다면 통과
    ### 해당 이름을 완주자에서 제외시켜서 동명이인 문제 해결
        if name in completion:
            completion.remove(name)
            continue
    ### 완주자 이름에 없으면 미완주자 리스트에 넣어버리기    
        else:
            uncompletion.append(name)
    ### 출력하기
    print(f"uncompletion : {uncompletion}")

    return uncompletion​

 

4) 고객 데이터 관리 시스템

     요구사항

1. Customer 클래스를 정의

2. join_customer, add_points, reduce_points 메소드를 구현

3. 포인트 점수가 감소될 때, 포인트 점수가 음수가 되지 않도록 할 것

2의 join_customer의 인자 중에 email이 있기 때문에
2)번 문제와 결합하고 싶었다.

3번 조건 또한 1)번과 연결된다고 생각한다.

각주처리를 해놨기 때문에 플로우는 쓰고 싶지 않다.
class Customer():
    ### join_customer를 통해 바꿀 인자들을 이미 만들어 놓기
    name = ""
    email = ""
    point = 0
    check_list = []
    ### check_list는 join_customer의 인자들에 문제가 있는지 확인하는 장치
    ### 문제가 있는 경우 check_list의 성분에 1을 추가 한다
    ### sum(check_list) > 0인 경우에 오류 문구를 출력하고
    ### add_points, reduce_points 등 다른 메서드는 작동하지 않는다


    ### 아래와 같이 함수 인자의 타입에 대한 힌트를 남기는 것을
    ### 어노테이션이라고 한다
    def join_customer(self, name: str, email: str, point: int):
        ### name은 문자열로만 입력해야 함
        ### 그러지 않을 시, check_list에 1 추가하기
        if type(name) != str:
            print("Name Error")
            print('이름은 문자열이여야 합니다')
            print()
            self.check_list.append(1)
        else:
        ### name은 1글자 이상이여야 함
        ### 그러지 않을 시, check_list에 1 추가
        ### 모두 만족하면 self.name을 name으로 교체
        ### check_list에도 0 추가
            if len(name) == 0:
                print("Name Error")
                print("이름은 1글자 이상이여야 합니다")
                print()
                self.check_list.append(1)
            else:
                self.name = name
                self.check_list.append(0)

        ### 이메일의 조건은 2번 문제에서 가져왔음
        if type(email) != str:
            print("E-mail Structure Error")
            print('E-mail은 문자열 타입으로 입력해야만 합니다')
            print()
            self.check_list.append(1)
        else:
            if '@' in email:
                core = email.split('@')
                if len(core) != 2:
                    print("E-mail Structure Error")
                    print(f"{email} : 유효하지 않은 이메일 주소입니다")
                    print()
                    self.check_list.append(1)
                else:
                    id, domain = core[0], core[1]
                    if id == "":
                        print("E-mail Structure Error")
                        print(f"{email} : 유효하지 않은 이메일 주소입니다")
                        print()
                        self.check_list.append(1)
                    else:
                        if '.' in domain:
                            less = domain.split(".")
                            if "" in less:
                                print("E-mail Structure Error")
                                print(f"{email} : 유효하지 않은 이메일 주소입니다")
                                print()
                                self.check_list.append(1)
                            else:
                                self.email = email
                                self.check_list.append(0)
                        else:
                            print("E-mail Structure Error")
                            print(f"{email} : 유효하지 않은 이메일 주소입니다")
                            print()
                            self.check_list.append(1)
            else:
                print("E-mail Structure Error")
                print(f"{email} : 유효하지 않은 이메일 주소입니다")
                print()
                self.check_list.append(1)

        ### 포인트는 정수형으로
        if type(point) != int:
            print("Point Form Error")
            print("포인트는 정수형이여야 합니다")
            print()
            self.check_list.append(1)
        ### 정수형이라면 양수로
        else:
            if point < 0:
                print("Point Form Error")
                print("포인트는 0보다 크거나 같아야 합니다")
                print()
                self.check_list.append(1)
            else:
                self.point = point
                self.check_list.append(0)
        ### join_customer 인자 입력시 문제가 없어서
        ### check_list에 1이 없으면
        ### 등록된 회원정보 출력
        if sum(self.check_list) == 0:
            print("Welcome!")
            print("---------------------------")
            print(f"이름 : {self.name}")
            print(f"E-mail : {self.email}")
            print(f"Point : {self.point}")
            print()
        ### 인자에 하나라도 문제가 있으면
        ### 오류문구 출력
        else:
            print("Join Customer Error")
            print("소비자 데이터 입력이 잘못 되었습니다")
            print("다시 입력 부탁드립니다")
            print()

    def add_points(self, add: int):
        ### join_customer 인자에 문제가 있으면
        ### 메서드 사용 불가
        if sum(self.check_list) == 0:
            if type(add) != int:
                print("Add Points Error")
                print('포인트는 정수형이여야 합니다')
                print()
            else:
                if add >= 0:
                    print("Add Points")
                    print("---------------------------")
                    print(f"이름 : {self.name}")
                    print(f"현재 Point : {self.point}")
                    self.point = self.point + add
                    print(f"{add} 만큼의 포인트를 더합니다")
                    print(f"잔여 Point : {self.point}")
                    print()
                else:
                    print("Add Points Error")
                    print('양수로 입력해주시기 바랍니다')

    def reduce_points(self, reduce: int):
        ### join_customer 인자에 문제가 있으면
        ### 메서드 사용 불가
        if sum(self.check_list) == 0:
            if type(reduce) != int:
                print("Reduce Points Error")
                print('포인트는 정수형이여야 합니다')
            else:
                if reduce >= 0:
                    print("Reduce Points")
                    print("---------------------------")
                    print(f"이름 : {self.name}")
                    print(f"현재 Point : {self.point}")
                    self.point = self.point - reduce
                    print(f"{reduce} 만큼의 포인트를 뺍니다")
                    ### 포인트가 음수가 되면 0으로 처리해주기
                    if self.point < 0:
                        self.point = 0
                    print(f"잔여 Point : {self.point}")
                    print()
                else:
                    print("Reduce Points Error")
                    print('양수로 입력해주시기 바랍니다')




customer1 = Customer()
customer1.join_customer("Alice", "alice@example.com", 100)
customer1.add_points(50)
customer1.reduce_points(20)
customer1.reduce_points(150)

 

100줄이 넘는 코드를 오랜만에 작성했다.

 

실제 서비스나 어플의 소스코드는 과연 몇 줄일까...

반응형

'TIL' 카테고리의 다른 글

내배캠 TIL 15일차  (1) 2024.01.09
내배캠 TIL 14일차  (0) 2024.01.08
내배캠 TIL 12일차  (2) 2024.01.04
내배캠 TIL 11일차  (0) 2024.01.03
내배캠 TIL 10일차  (1) 2024.01.02