오늘도 파이썬 코테연습!
https://school.programmers.co.kr/learn/courses/30/lessons/131127
마트 회원이 되면 10일간 매일 한가지 제품을 할인받을 수 있다. 원하는 제품과 수량이 할인하는 날짜와 10일 연속으로 일치할 경우에 맞춰서 회원가입을 하려고 한다.
원하는 제품을 담은 want 배열과 원하는 제품의 수량을 담은 int 배열 number, 할인하는 제품을 담은 배열 discount가 주어진다. 회원 등록시 원하는 제품을 모두 할인받을 수 있는 회원 등록 날짜의 총 일수를 return 해라. 가능한 날이 없으면 0 을 반환해라.
카운터와 슬라이딩 윈도우를 사용해서 문제를 풀어봤다.
원하는 상품과 개수를 딕셔너리로 만든다. dict(zip(want,number))
를 사용하면 want를 key로 number를 value로 하는 dict를 만들 수 있다.
반복문으로 슬라이딩 윈도우 기법을 사용해 10일 간격으로 할인 목록을 확인한다. 현재일부터 10일까지의 window를 만들고, 이를 카운터로 바꿔서 몇개의 품목이 있는지 확인한다.
all() 함수와 리스트 컴프리헨션을 이용해서 현재 10일동안의 할인 목록에서 원하는 상품 이상만큼 다 있는지 확인한다. 다 만족하면 count를 늘려준다. 최종적으로 count를 반환하면 완료!
from collections import Counter
def solution(want, number, discount):
want_dict = dict(zip(want, number))
total = len(discount)
days = 10
count = 0
for i in range(total-days+1):
current_window = discount[i:i+days]
current_count = Counter(current_window)
if all(current_count[item] >= want_dict[item] for item in want_dict):
count += 1
return count