코딩 테스트/프로그래머스

[Python] 프로그래머스 lv.2 의상

위시리 2024. 11. 25. 19:05

 

문제 해석

  • 매일 다른 옷 조합 : 최소 1개는 달라야함
  • 각 종류별로 최대 1가지 의상만 입을 수 있음
  • 하루 최소 한 개의 의상은 입음
  • 서로 다른 옷의 조합의 수 return

 

코드 설계

  • 입력 : 각 종류를 key로 해서, 값을 해당 키에 넣기
  • : 각 키에는 하나의 값만 들어갈 수 있음 → 하나의 리스트로 만들어서 넣으면 됨
  • 1 ~ 전체 옷의 종류 수 : 하루 입는 옷의 가지 수의 경우의 수 r
  • 전체 종류 중 r개를 고르고, 각 r개에서 나올 수 있는 조합 선택

 

실패

 

정답 코드

다른 사람 코드 1

https://dduniverse.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%9D%98%EC%83%81-%ED%8C%8C%EC%9D%B4%EC%8D%AC-python

def solution(clothes):
    answer = 0
    closet = {}
    for name, kind in clothes:
        if kind in closet.keys():
            closet[kind] += [name]
        else :
            closet[kind] = [name]

    # a의 종류가 n개, b의 종류가 m개일 때 가능한 모든 경우의 수 (n+1)(m+1)
    answer = 1
    for _, value in closet.items():
        print(value)
        answer *= len(value)+1 # (n+1)(m+1)
    return answer-1 # 아무것도 입지 않는 경우 제외
  • 리스트에서 한 배열의 크기에 대해 값이 2개이면 두 개의 인자로 받을 수 있다.
  • 해시에 넣고, 최소 한가지 answer = 1 초기화 (마지막에 모두 입지 않는 경우 제외)

 

다른 사람 풀이 2 - Counter

from collections import Counter
from functools import reduce

def solution(clothes):
    # 의상 종류별 Counter
    counter = Counter([type for name, type in clothes])

    # 모든 종류의 count+1을 누적하여 곱
    answer = reduce(lambda acc, cur:acc*(cur+1), counter.values(), 1) -1
    return answer

 

다른 사람 풀이 3

def solution(clothes):
    answer = 1
    closet = {}
    for _,k in clothes :
        if k in closet :
            closet[k] += 1
        else :
            closet[k] = 1
    
    for k in closet :
        answer *= closet[k]+1
    
    return answer-1