[프로그래머스] 의상

융쬬·2024년 4월 16일

Algorithm

목록 보기
10/24

문제 바로가기

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

 

💡 문제 요약

  • 코니가 가진 옷 clothes가 2차원 배열로 주어집니다.
  • clothes의 각 행은 [의상 이름, 의상 종류]로 이루어져 있습니다.
  • 코니는 각 의상 종류별로 최대 1가지 의상만 착용할 수 있습니다.
  • 착용한 의상의 일부가 겹치더라도, 다른 의상이 겹치지 않거나, 혹은 의상을 추가로 더 착용한 경우에는 서로 다른 방법으로 옷을 착용한 것으로 계산합니다.
  • 코니는 하루에 최소 한 개의 의상은 입습니다.
  • 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.

ex)

clothes출력
[["yellow_hat", "headgear"], ["blue_sunglasses", "eyewear"], ["green_turban", "headgear"]]5
[["crow_mask", "face"], ["blue_sunglasses", "face"], ["smoky_makeup", "face"]]3

 

💡 알고리즘 설계

  • 각 의상 종류를 key 값으로, 각 의상 종류마다 포함하고 있는 의상 이름의 갯수를 value 값으로 갖는 딕셔너리 dict_clothes를 생성한다.
  • 코니는 하루에
    • 각 의상 종류별로 0개 혹은 1개의 의상을 입을 수 있다. → 의상을 안 입는 경우도 생각해주어야 하기 때문에 각 의상 종류의 value값에 +1을 해준 값을 다 곱해준다. ⇒ 조합으로 생각
    • 최소 한 개의 의상을 입는다. → 옷을 아예 안 입는 경우를 제외 해야하기 때문에 -1을 해준다.

💡 내 코드

def solution(clothes):
    dict_clothes={}
    for i in range(len(clothes)):
        if clothes[i][1] not in dict_clothes:
            dict_clothes[clothes[i][1]]=1
        else:
            dict_clothes[clothes[i][1]]+=1
            
    mul=1
    for num_clothes in dict_clothes.values():
        mul*=(num_clothes+1)

    return mul-1

 

💡 다른 풀이

  • collections의 Counter()를 사용한 풀이
def solution(clothes):
    from collections import Counter
    from functools import reduce
    cnt = Counter([kind for name, kind in clothes])
    answer = reduce(lambda x, y: x*(y+1), cnt.values(), 1) - 1
    return answer

 

💡 느낀점

  • 조합 구하는 과정에서 각 의상 종류의 value 값에 +1 해주는 것을 생각하지 못 했다..
  • Counter는 언제쯤 자연스럽게 떠올릴 수 있을까..?🥹
profile
영어공부 하는 Computer Scientist

0개의 댓글