24.01.08 Python 개인 과제

예진·2024년 1월 8일
0

TIL

목록 보기
13/68

(문제 1) 제품 재고 관리

배경:

당신은 소매점에서 근무하며 제품의 재고 관리를 담당하고 있습니다. 제품의 재고는 매주 갱신되며, 재고가 부족하거나 과잉인 제품을 식별하는 것이 중요합니다.

목표:

주어진 제품의 재고 데이터를 분석하여, 재고가 기준치 미안인 제품과 기준치 초과인 제품을 식별하는 프로그램을 작성하세요.

데이터:

  • 재고 데이터는 이중 리스트로 제공되며 첫 번째 전달인자로 받습니다
    • 이중 리스트의 각 요소는 [제품명, 현재 재고량] 형식의 리스트입니다.
    • 예: [['Apple', 30], ['Banana', 20], ['Orange', 50]]
  • 재고 기준치는 함수에서 두 번째 인자(하나의 기준치)로 받습니다. 기준치 이하면 재고가 부족한 것으로, 기준치 이상이면 재고가 과잉인 것으로 간주합니다.

요구사항:

  1. 각 제품의 재고량이 주어진 기준치보다 많은지 적은지를 판단합니다.(동일 고려 x)
    1. ex) 기준치를 25로 설정한다면 apple, orange는 과잉, banana는 부족입니다.
  2. 재고가 부족한 제품과 과잉인 제품의 목록을 출력합니다.
  3. 위 내용을 구현한 함수명을 check_inventory 로 작성하세요
# 재고 데이터 예시
inventory_data = [
    ['Apple', 30],
    ['Banana', 20],
    ['Orange', 50]
]

#코드 예시 
#기준치 20으로 판별하기
check_inventory(inventory_data, 20)


#문제 풀이
inventory_data = [
    ['Apple', 30],
    ['Banana', 20],
    ['Orange', 50],
    ['Strawberry', 25],
    ['Grape', 17],
    ['Melon', 42],
    ['Peach', 33],
    ['Kiwi', 39],
    ['Cherry', 48]
]
def check_inventory(inventory_data):  #def 함수명 지정
    lack_list = []   #재고가 부족한 제품 목록
    excess_list = []  #재고가 과잉인 제품 목록

    for fruit, quantity in inventory_data: #반복문 설정
        if quantity < x:            #수량이 기준치보다 적을 경우
            lack_list.append(fruit)  #재고부족 목록에 제품명 추가
        elif quantity > x:          #수량이 기준치보다 클 경우
            excess_list.append(fruit) #재고과잉 목록에 추가

    print('lack_list: ', list(lack_list))
    print('excess_list: ', list(excess_list))
x = 25
check_inventory(inventory_data)

---------------------------------------------

x = 25를 삭제하고 싶다면 전달인자를 2개로 받자!
def check_inventory(inventory_data): 에 x를 추가하여,
def check_inventory(inventory_data, x): 로 변경하고,
check_inventory(inventory_data, (x=)22) x의 자리에 원하는 숫자를 넣으면
x의 값을 22로 계산한 결과가 출력된다!

---------------------------------------------
#제출 답안
def check_inventory(inventory_data, x):
    lack_list = []
    excess_list = []

    for fruit, quantity in inventory_data:
        if quantity < x:
            lack_list.append(fruit)
        elif quantity > x:
            excess_list.append(fruit)

    print('lack_list: ', list(lack_list))
    print('excess_list: ', list(excess_list))

check_inventory(inventory_data, x)

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

배경:

당신은 회사의 고객 데이터베이스를 관리하고 있습니다. 데이터베이스에 저장된 고객의 이메일 주소가 유효한 형식을 갖추고 있는지 검증하는 작업이 필요합니다.

목표:

문자열 형태의 이메일 주소 목록을 분석하여, 각 이메일 주소가 올바른 형식을 갖추고 있는지 판단하는 프로그램을 작성하세요.

데이터:

  • 이메일 주소는 문자열 리스트로 제공됩니다.
  • 올바른 이메일 주소의 형식은 다음과 같습니다:
    • 하나의 '@' 기호를 포함해야 합니다.
    • '@' 기호 앞에는 하나 이상의 문자가 있어야 합니다.
    • '@' 기호 뒤에는 도메인명이 와야 하며, 도메인명은 '.'을 포함한 하나 이상의 문자로 구성되어야 합니다.

요구사항:

  1. 각 이메일 주소가 올바른 형식을 갖추고 있는지 검사합니다. (문자열 메소드 사용)
  2. 올바른 형식의 이메일 주소인 경우, "유효한 이메일 주소입니다."를 출력합니다.
  3. 올바르지 않은 형식의 경우, "유효하지 않은 이메일 주소입니다."를 출력합니다.
  4. 위 내용을 구현한 함수명을 validate_emails 로 작성하세요.
email_list = [
    "example@example.com",
    "wrongemail@.com",
    "anotherexample.com",
    "correct@email.co.uk"
]

def validate_emails(email_list):
    for email in email_list:
        # '@' 기호의 위치 확인

        # '@' 기호가 없거나 맨 앞 또는 맨 뒤에 위치한 경우
        if ~~~~ :
            print(f"{email}: 유효하지 않은 이메일 주소입니다.")
            continue
        else:
        print(f"{email}: 유효한 이메일 주소입니다.")



# 함수 호출
validate_emails(email_list)

------------------------------------------------------------
#답안
def validate_emails(email_list):
    for email in email_list:

        if '@' not in email or email.count('@') != 1:
            print(f"{email} : 유효하지 않은 이메일 주소입니다.")
            continue
        else:
            if email.startswith('@') or email.endswith('@'):
                print(f"{email} : 유효하지 않은 이메일 주소입니다.")
                continue
            else:

                user, domain = email.split('@')
                if '.' not in domain or domain.startswith('.') or domain.endswith('.'):
                    print(f"{email} : 유효하지 않은 이메일 주소입니다.")
                    continue
                else:
                    print(f"{email} : 유효한 이메일 주소입니다.")

email_list = [
    "example@example.com",
    "wrongemail@.com",
    "anotherexample.com",
    "correct@email.co.uk"
]
validate_emails(email_list)


for : email_list 중 email이
if1 : '@'기호가 없거나 1과 같지 않을 경우 (유효하지 않다 출력 / 진행)
if2 : '@'기호가 맨 앞에 있거나 맨 뒤에 있는 경우 (유효하지 않다 출력 / 진행)
else2 : '@'를 기준으로 user와 domain 분리
if3 : '.'이 없거나, '.'이 맨 앞 혹은 맨 뒤에 있는 경우 유효하지 않다 출력
else3 : 유효하다 출력

(문제 3) 마라톤 미 완주자 찾기

배경:

마라톤 대회에서 모든 선수가 경주를 완주하려 했지만, 한 명의 선수만이 완주하지 못했습니다. 주최측은 참가자 명단과 완주자 명단을 가지고 있으며, 누가 완주하지 못했는지 알아내야 합니다.

목표:

마라톤 참가자 명단과 완주자 명단이 주어졌을 때, 완주하지 못한 선수의 이름을 찾는 함수를 작성하세요.

데이터:

  • participant: 마라톤 참가자의 이름이 담긴 리스트
  • completion: 마라톤을 완주한 선수의 이름이 담긴 리스트

요구사항:

  1. 참가자 명단에서 완주자 명단에 없는 선수를 찾습니다.단 참가자명단에는 동명이인이 있을 수 있습니다.
  2. 완주하지 못한 선수의 이름을 반환합니다.
  3. 위 내용을 구현한 함수를 find_non_completer 로 작성하세요
# 예시 데이터
participant = ["mike", "lisa", "tom", "lisa"]
completion = ["tom", "mike", "lisa"]
---------------------------------------------------------
#답안
def find_non_completer(participant, completion):
    participant_count = {}

    for name in participant:
        if name in participant_count:
            participant_count[name] += 1
        else:
            participant_count[name] = 1

    for name in completion:
        participant_count[name] -= 1

    for name, count in participant_count.items():
        if count > 0:
            return name

result = find_non_completer(participant, completion)
print("완주하지 못한 선수:", result)

participant_count : 참가자 명단에서 이름의 등장 횟수를 저장할 딕셔너리를 만든다.
1. for / if : 참가자 명단에서 이름의 등장 횟수를 기록한다.
2. for / if : 완주자 명단에서 이름의 등장 횟수를 뺀다.
3. for / if : 등장 횟수가 0보다 큰 선수의 이름을 return 한다.

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

배경:

당신은 소매점의 데이터 분석가로, 고객 데이터를 관리하는 시스템을 구축하려고 합니다. 각 고객의 이름, 이메일, 포인트 점수를 관리하고, 포인트 점수를 추가하거나 감소 시킬 수 있는 기능이 필요합니다.

목표:

Customer 클래스를 작성하여, 각 고객의 이름, 이메일, 포인트 점수를 관리하고, 포인트 점수를 추가하거나 감소 시키는 메소드를 구현하세요.

데이터:

  • Customer 클래스는 고객의 고객의 이름② 이메일③ 포인트 점수를 속성으로 가집니다.
  • 포인트 점수를 관리하는 메소드는 다음과 같습니다:
    • *join_customer**: 고객의 이름, 이메일, 포인트를 설정합니다.
    • add_points(amount): 주어진 양만큼 포인트 점수를 추가합니다.
    • reduce_points(amount): 주어진 양만큼 포인트 점수를 감소시킵니다.

요구사항:

  1. Customer 클래스를 정의합니다.
  2. *join_customer , add_points*, reduce_points 메소드를 구현합니다.
  3. 포인트 점수가 감소될 때, 포인트 점수가 음수가 되지 않도록 합니다.
#확인코드
customer1 = Customer()
customer1.join_customer("Alice", "alice@example.com", 100)
customer1.add_points(50)
customer1.reduce_points(20)
customer1.reduce_points(150)  # 포인트 부족 상황 테스트

class Customer:
    def __init__(self, name, email, point):
        self.name = name
        self.email = email
        self.point = point
c = Customer('JeongYejin', 'jyeden@gmail.com', 0)

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

   def add_points(self, amount):
       self.point += amount
   def reduce_points(self, amount):
       if self.point - amount > 0:
           self.point -= amount
       else:
           print("point : 0")

#확인코드
customer1 = Customer()
customer1.join_customer("Alice", "alice@example.com", 100)
customer1.add_points(50)
customer1.reduce_points(20)
customer1.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, amount):
       self.point += amount
   def reduce_points(self, amount):
       if self.point - amount > 0:
           self.point -= amount
       else:
           print("point : 0")
profile
Data Analysis / 맨 땅에 헤딩

0개의 댓글