Python/CoTe

[프로그래머스] level2 할인 행상 - 파이썬

joannekim0420 2024. 1. 30. 02:41
728x90

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/131127

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

아... 왤케 문제 글이 길면 읽기 싫지...괜히 이해 더 안 가는 것 같은 착각. 이 문제가 그랬다..

막상 생각보다 쉬운 문제라 10분 컷 했나.. 

 

 

 

 

접근법

0. number의 합은 항상 10이고 항상 연속 10일이다. 

1. want 속 물품들과 number 들 간의 pair를 dictionary 로 만들어 준다. 

2. for 문으로 discount 중 처음부터 10일씩 잘라가며 1에서 만든 dictionary 를 모두 구매할 수 있는지 확인

3. 물품이 모두 나왔다면 dictionary value 들은 모두 0 이어야하기 때문에 0인 날들만 세기

 

 

 

 

내 코드 

def solution(want, number, discount):
    answer = 0
    want_dict = {}
    
    for i in range(len(discount)-9):
        for w, n in zip(want, number):
            want_dict[w] = n
        for dis in discount[i:i+10]:
            if dis in want_dict and want_dict[dis] > 0:
                want_dict[dis] -= 1
        if set(want_dict.values()) == {0}:
            answer+=1
            
    return answer

 

만든 dictionary에서 소거법으로 -1 씩 했기 때문에 이중 for문으로 새로운 날이 되면 다시 dictionary를 만들어줘야했다. 

 

 

 

다른 풀이

from collections import Counter
def solution(want, number, discount):
    answer = 0
    dic = {}
    for i in range(len(want)):
        dic[want[i]] = number[i]

    for i in range(len(discount)-9):
        if dic == Counter(discount[i:i+10]): 
            answer += 1

    return answer

 

Counter 를 사용해서 소거법으로 하지 않고, 내가 만든 딕셔너리랑 같은지 확인하는 방식으로 계산. 

Counter 의 존재를 좀 더 활용하고 싶은 마음에 가져온 풀이