Techbrad

[프로그래머스] 할인 행사 - 파이썬 본문

Programming/코딩테스트

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

brad.min 2024. 2. 4. 22:57
반응형

 

 

프로그래머스

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

programmers.co.kr

 

문제 접근 방법

want와 number를 통해 딕셔너리를 만들고 discount 리스트를 순회하여 number 를 -1로 만드는 방식으로 접근했다.

ex) {banana : 3} 인 경우 discount에 바나나가 있을때 {banana : 2}가 된다.

 

제출코드

def solution(want, number, discount):

    dic = {}
    for w, n in zip(want, number): ###1
        dic[w] = n
	
    ###2
    iter = len(discount) - 10 + 1
    answer = 0
    for i in range(0, iter):
        n_dic = dic.copy()
        
        ###3
        for d in discount[0+i : 10+i]:
            if d in n_dic:
                n_dic[d] -= 1
        
        ###4
        buy_all = True
        for key in n_dic.keys():
            if n_dic[key] != 0:
                buy_all = False

        if buy_all:
            answer += 1
    return answer

 

###1 : want, number를 사용해서 딕셔너리를 만든다.

###2 : 몇번 순회를 할 수 있는지 iter 변수에 담는다.

###3 : discount 목록 순회를 돌며 같은 키 값이 있으면 -1로 차감한다.

###4 : 모든 키의 값이 0이 아니면 buy_all은 False, 모든 키의 값이 0이면 True이다. True인 경우 answer +1이 된다.

 

위의 코드 또한 성공을 하였지만 딕셔너리끼리 같은지 확인하는 방법을 쓰면 시간 복잡도를 줄일 수 있었다.

아래와 같이 딕셔너리끼리 비교했을떄 같으면 True, 틀리면 False를 반환하는 점을 이용한다.

if dic1 == dict2

 

 

따라서 아래와 같이 코드를 수정했다. 시간 복잡도를 줄이고 코드 또한 단순화 할 수 있었다.

def solution(want, number, discount):
    dic = {}
    for w, n in zip(want, number):
        dic[w] = n
    iter = len(discount) - 10 + 1
    answer = 0
    for i in range(0, iter):
        dic_10d = {}
        for d in discount[0+i : 10+i]:
            if d in dic_10d:
                dic_10d[d] += 1
            else:
                dic_10d[d] = 1
        if dic == dic_10d:
            answer += 1
    return answer

 

반응형