오늘은 python 기초 문법에 대한 강의를 모두 끝마치고 개인과제 2차로 나온 python 과제를 진행하며 겪은 이야기들을 작성하려 합니다.
내배캠 참여 전에 독학해온 실력을 바탕으로 기초문법을 수강하니 역시 두번, 세번 듣는 것이 익숙해지고 귀에 잘 들어오는 것 같았습니다:)
(문제 1) 제품 재고 관리
배경:
당신은 소매점에서 근무하며 제품의 재고 관리를 담당하고 있습니다. 제품의 재고는 매주 갱신되며, 재고가 부족하거나 과잉인 제품을 식별하는 것이 중요합니다.
목표:
주어진 제품의 재고 데이터를 분석하여, 재고가 기준치 이하인 제품과 기준치 이상인 제품을 식별하는 프로그램을 작성하세요.
데이터:
- 재고 데이터는 이중 리스트로 제공되며 첫 번째 전달인자로 받습니다
- 이중 리스트의 각 요소는 [제품명, 현재 재고량] 형식의 리스트입니다.
- 예:
[['Apple', 30], ['Banana', 20], ['Orange', 50]]
- 재고 기준치는 함수에서 두 번째 인자(하나의 기준치)로 받습니다. 기준치 이하면 재고가 부족한 것으로, 기준치 이상이면 재고가 과잉인 것으로 간주합니다.
요구사항:
- 각 제품의 재고량이 주어진 기준치보다 많은지 적은지를 판단합니다.(동일 고려 x)
- ex) 기준치를 25로 설정한다면 apple, orange는 과잉, banana는 부족입니다.
- 재고가 부족한 제품과 과잉인 제품의 목록을 출력합니다.
- 위 내용을 구현한 함수명을
check_inventory
로 작성하세요내가 작성한 코드
결과
이 문제는 크게 막히는 부분은 없었으며, 인덱싱과 if문의 활용과 구조를 고민할 수 있어서 좋았습니다 😁
(문제 2) 이메일 주소 유효성 검사
배경:
당신은 회사의 고객 데이터베이스를 관리하고 있습니다. 데이터베이스에 저장된 고객의 이메일 주소가 유효한 형식을 갖추고 있는지 검증하는 작업이 필요합니다.
목표:
문자열 형태의 이메일 주소 목록을 분석하여, 각 이메일 주소가 올바른 형식을 갖추고 있는지 판단하는 프로그램을 작성하세요.
데이터:
- 이메일 주소는 문자열 리스트로 제공됩니다.
- 올바른 이메일 주소의 형식은 다음과 같습니다:
- 하나의 '@' 기호를 포함해야 합니다.
- '@' 기호 앞에는 하나 이상의 문자가 있어야 합니다.
- '@' 기호 뒤에는 도메인명이 와야 하며, 도메인명은 '.'을 포함한 하나 이상의 문자로 구성되어야 합니다.
요구사항:
- 각 이메일 주소가 올바른 형식을 갖추고 있는지 검사합니다. (문자열 메소드 사용)
- 올바른 형식의 이메일 주소인 경우, "유효한 이메일 주소입니다."를 출력합니다.
- 올바르지 않은 형식의 경우, "유효하지 않은 이메일 주소입니다."를 출력합니다.
- 위 내용을 구현한 함수명을
validate_emails
로 작성하세요.내가작성한 코드 !
결과
여기서는 여러가지 잘못된 형식의 이메일은 어떤 케이스가 있을까를 먼저 생각해야 했습니다. @가 없는 경우, 마침표 앞에 문자가 없는 경우를 생각했는데 개별 email을 for문으로 순회하면서 split 함수와 인덱싱을 통해서 올바른 email 주소를 판별하는 작업과 if문을 중첩으로 사용하며 원하는 결과를 나오게 해주는 것이 매우 재미있었습니다.
-> 개인과제 해설시간에 'wrongemail@.com'는 요구사항에 따라 올바른 주소라고 합니당...하핳 첫 번째 if문에서 '.'으로 split 하지않고 그냥 있는지 없는지 체크하는 걸로 바꾸면 됩니당!
(문제 3) 마라톤 미 완주자 찾기
배경:
마라톤 대회에서 모든 선수가 경주를 완주하려 했지만, 한 명의 선수만이 완주하지 못했습니다. 주최측은 참가자 명단과 완주자 명단을 가지고 있으며, 누가 완주하지 못했는지 알아내야 합니다.
목표:
마라톤 참가자 명단과 완주자 명단이 주어졌을 때, 완주하지 못한 선수의 이름을 찾는 함수를 작성하세요.
데이터:
participant
: 마라톤 참가자의 이름이 담긴 리스트completion
: 마라톤을 완주한 선수의 이름이 담긴 리스트요구사항:
- 참가자 명단에서 완주자 명단에 없는 선수를 찾습니다.단 참가자명단에는 동명이인이 있을 수 있습니다.
- 완주하지 못한 선수의 이름을 반환합니다.
- 위 내용을 구현한 함수를
find_non_completer
로 작성하세요내가 작성한 코드
결과
문제 3번은 요구사항 1번에 동명이인이 있을 수 있다는 점과, 두 리스트를 차집합 해야한다는 포인트를 찾았습니다. 차집합에 문제가 없도록 각 리스트 내에서 중복 이름을 제거하기 위해 set함수를 활용, f-string 활용, 차집합 결과에 미 완주자와 완주자를 구별하여 출력해주기 위해 if문으로 1명이라도 차집합 결과가 나왔는지 확인하기 위해 len함수로 존재하는지 체크하였습니다. 단순하지만 다양하게 풀어볼 수도 있는 문제인 것 같았습니다! 🥸
-> 동명이인에 대해서도 미 완주자를 찾아야하는 것이 문제 제작자의 의도라고 합니다. 여기서는 중복을 제거하는 set함수를 쓰지않고 푸는 것이 맞습니다.
(문제 4) 고객 데이터 관리 시스템
배경:
당신은 소매점의 데이터 분석가로, 고객 데이터를 관리하는 시스템을 구축하려고 합니다. 각 고객의 이름, 이메일, 포인트 점수를 관리하고, 포인트 점수를 추가하거나 감소 시킬 수 있는 기능이 필요합니다.
목표:
Customer
클래스를 작성하여, 각 고객의 이름, 이메일, 포인트 점수를 관리하고, 포인트 점수를 추가하거나 감소 시키는 메소드를 구현하세요.데이터:
Customer
클래스는 고객의① 고객의 이름, ② 이메일, ③ 포인트 점수를 속성으로 가집니다.- 포인트 점수를 관리하는 메소드는 다음과 같습니다:
**join_customer**
: 고객의 이름, 이메일, 포인트를 설정합니다.add_points(amount)
: 주어진 양만큼 포인트 점수를 추가합니다.reduce_points(amount)
: 주어진 양만큼 포인트 점수를 감소시킵니다.요구사항:
Customer
클래스를 정의합니다.**join_customer
,add_points
,reduce_points
** 메소드를 구현합니다.- 포인트 점수가 감소될 때, 포인트 점수가 음수가 되지 않도록 합니다.
내가 작성한 코드
결과
이 문제는 처음으로 직접 class 메소드를 활용해본 케이스였는데요. 해당 문제에선 클래스 안에 함수를 생성할 때 클래스가 지정되는 객체의 이름을 할당하기 위해서 코드 괄호안에 첫번 째 인자에 self를 주는 것이 막혔고 이 부분을 구글링하여 해결하였습니다. 클래스를 적용할 각각의 객체가 있을 것이기 때문에 사용합니다.
마지막 줄 확인코드에서 변수 하나를 클래스를 지정하는데 customer1이 self자리에 들어가게 되는 것이며 각각의 함수에서 해당하는 객체에 대한 적용을 하기 위함이라 이해하면 되겠습니다.
마지막으로 요구사항을 잘 확인하며 모든 요구사항이 충족되었는지 체크하며 마무리하였습니다😁
-> 마지막에 포인트를 빼야하는데 포인트가 부족한 상황에서는 그대로의 포인트를 보여주고 부족하다고 하여 뺄 수 없음을 알려줘야 맞는 것 같다.
오늘 개인 과제를 통해서 느낀점
이전에 SQL을 학습하느라 많이 잊었을 것 같다는 두려움이 있었는데 막상 시작해보니 휘발되지않고 잘 기억하고 있어서 다행이라고 생각했고, 코드카타를 통해서 푸는 것과는 또 다른 느낌이 들었다. 실무에서 타부서와 소통하는 과정이 매우 중요할 것이라고 생각했고, 요구사항이 제대로 이뤄졌는지 크로스체크하는 것도 습관으로 만들어야 겠다고 생각했다.