(Python3) 할인 이벤트

문제 설명

XYZ Mart는 일정 금액을 지불하면 10일 동안 회원 자격을 부여합니다. XYZ 마트는 회원들을 위해 매일 한 가지 상품에 대한 할인 이벤트를 진행합니다. 1일 1개 할인 상품만 구매하실 수 있습니다. 알뜰한 정현은 원하는 상품과 수량이 10일 연속 할인일과 일치할 때 회원가입을 하려고 한다.

예를 들어 현정이가 바나나 3개, 사과 2개, 쌀 2개, 돼지고기 2개, 냄비 1개를 원하고 XYZ 마트가 15일 동안 회원들에게 원하는 상품은 닭고기, 사과, 사과, 바나나, 쌀, 사과, 돼지고기, 바나나, 돼지고기, 쌀, 냄비, 바나나, 사과, 바나나. 첫날부터 10일까지는 훠궈 할인이 없기 때문에 첫날은 회원가입을 하지 않습니다. 2일차부터 10일차까지는 바나나를 할인된 가격으로 원하는 만큼 살 수 없어서 2일차에도 회원가입을 하지 않는다. 3일, 4일, 5일에는 각각 10일씩 원하는 상품과 수량이 일치하니 셋 중 하나를 신청하면 된다.

현정이가 원하는 제품을 나타내는 문자열의 배열 want와 정현정이 원하는 제품의 수량을 나타내는 정수 배열. number, XYZ Mart에서 할인된 상품을 나타내는 문자열의 배열 할인이 되었을 때 정현정이 회원가입 시 원하는 모든 상품에 대해 할인을 받을 수 있는 총 회원등록 일수를 반환하는 솔루션 기능을 완성한다. 가능한 날짜가 없으면 0을 반환합니다.


제한

  • 1 ≤ 원하는 길이 = 숫자 길이 ≤ 10
    • 1 ≤ 숫자 ≤ 10의 요소
    • 숫자(i)는 원하는 수량을 의미합니다(i), number 요소의 합은 10입니다.
  • 10 ≤ 할인 기간 ≤ 100,000
  • 원하는 할인 요소는 알파벳 소문자로 구성된 문자열입니다.
    • 1 ≤ 원하는 요소의 길이, 할인 요소의 길이 ≤ 12

I/O 예시

원하다 숫자 할인 결과
(“바나나”, “사과”, “쌀”, “돼지고기”, “냄비”) (3, 2, 2, 2, 1) (“닭고기”, “사과”, “사과”, “바나나”, “쌀”, “사과”, “돼지고기”, “바나나”, “돼지고기”, “쌀”, “냄비”, “바나나”, ” 사과”, “바나나”)
(“사과”) (10) (“바나나”, “바나나”, “바나나”, “바나나”, “바나나”, “바나나”, “바나나”, “바나나”, “바나나”, “바나나”) 0

문제 해결


사전처럼 나열? 사용할 수 있는 enumerate() 함수가 포인트입니다.

키 값과 요소가 아닌 인덱스 값과 요소를 뱉어내는 기능입니다.

def solution(want, number, discount):
    answer = 0
    total = ()
    #want 와 num를 합칠 리스트
    
    for i, j in zip(want, number) : 
        total += (i) * j 
        #각 항목의 개수를 풀어 리스트에 넣어줌
        #enumerate는 리스트의 인덱스랑 요소 따블 추출 인덱스 c 요소 p 사용
    #total = total.sort
    total = sorted(total) #정렬
    #(:len(total)) 도 (:len(total)+1) 도 다틀리더라.. 뒤에서 부터 찾음
    #슬라이싱을 사용해 범위지정 +1은 내가원하는 범위까지 하려면 붙여야함!
    for c, p in enumerate(discount(:-len(total)+1)) :
        if p in total : #p 요소가 total에 있을때
            if total == sorted(discount(c:len(total) + c)) :
                answer += 1 ;

    return answer

참조 블로그

https://blockdmask.466 목록 정렬

https://blockdmask.425 목록이란 무엇입니까?

for 문에 2개의 변수를 넣는 방법

https://ponyozzang.578