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

kiki·2024년 1월 14일
0

프로그래머스

목록 보기
60/78

문제 링크

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

문제 설명

  • 정현이가 원하는 제품을 나타내는 문자열 배열 want와 정현이가 원하는 제품의 수량을 나타내는 정수 배열 number, XYZ 마트에서 할인하는 제품을 나타내는 문자열 배열 discount가 주어졌을 때, 회원등록시 정현이가 원하는 제품을 모두 할인 받을 수 있는 회원등록 날짜의 총 일수를 return
  • 가능한 날이 없으면 0을 return

1차 시도

def solution(want, number, discount):
    cnt = 0
    want2 = []
    for w,n in zip(want, number):
        want2.extend([w]*n)
    want2.sort()
    for i in range(len(discount)-9):
        tmp = discount[i:i+10]
        if sorted(tmp)==want2:
            cnt+=1
    return cnt

리스트의 비교로 확인했다.
먼저 want를 리스트로 만들고 정렬해두고,
discount의 리스트를 10개씩 잘라서 이를 정렬해 want와 같은지 확인했다.

2차 시도

다른 풀이들을 보니 Counter를 사용해 풀이한 정답들이 있길래 나도 counter를 사용해봤다.

from collections import Counter

def solution(want, number, discount):
    cnt = 0
    want_dic = dict(zip(want,number))
    for i in range(len(discount)-9):
        if Counter(discount[i:i+10]) == want_dic:
            cnt+=1
    return cnt

want를 dictionary로 만들고 이를 discount를 10씩 잘라서 Counter 함수를 씌운 결과값과 비교했을 때 같으면 cnt를 증가시키는 식으로 코드를 작성했다.

근데 아무래도 Counter를 사용해서인지 시간이 조금 더 걸리더라.

정리

  • Counter는 순서가 같지 않아도 값이 같은 경우엔 ==연산자가 먹히더라.
  • dictionary는 sorted를 쓰면 key만 정렬되어 출력되고 value는 안나온다.
    • sorted(want_dic.items(), key = lambda x:x[0]) 이렇게 쓰던
    • 내림차순 정렬론 most_common() 사용하면 된다.
  • dic(zip(a,b))로 두 리스트를 dictionary로 만들 수 있다.

0개의 댓글