문제 링크

[프로그래머스] 할인 행사

문제 풀이

문제 설명

10일간 할인하는 제품을 샀을 때, 원하는 걸 다 살 수 있는 날짜를 모두 찾는 문제이다. 즉, ["banana", "apple", "rice", "pork", "pot"]를 [3, 2, 2, 2, 1]개씩 사고 싶다면,

할인 행사가 아래처럼 개수가 일치할 경우, 해당 날짜는 원하는 걸 살 수 있는 날짜에 해당한다.

["apple", "banana", "rice", "apple", "pork", "banana", "pork", "rice", "pot", "banana"]

문제 접근 방식

각 제품을 Dictionary로 만든 후, 비교할 방식을 생각했다. 또한, 슬라이딩 윈도우 방식을 적용하여 10일이 지난 제품은 제거할 생각이다.

최종 코드

최종 코드는 아래와 같다.

def can_buy(want_dict, dis_dict):
    for prod in want_dict.keys():
        if want_dict[prod] > dis_dict.get(prod, 0):
            return False
    return True
 
def solution(want, number, discount):
    answer = 0
    want_dict = {}
    
    # 살 목록과 개수 저장
    for i in range(len(want)):
        want_dict[want[i]] = number[i]
 
    # discount를 순회하며 want_dict와 일치하는지 판단
    dis_dict = {}
    for i in range(len(discount)):
        # dis_dict에서 10일 지난 항목 제거
        if i >= 10:
            dis_dict[discount[i - 10]] -= 1
            
        # dis_dict에 추가
        dis_dict[discount[i]] = dis_dict.get(discount[i], 0) + 1
        
        # want_dict와 비교
        if can_buy(want_dict, dis_dict):
            answer+=1
    return answer

dictionary.get(item, 0)을 통해서 dictionary에 없을 경우, 0을 반환하는 방식을 알게 되었다.