알고리즘/해시

[프로그래머스] 위장 - 파이썬(python)

아뵹젼 2022. 5. 5.

 

나의 풀이

def solution(clothes):
    
    clothes_hash = {}
    count = 1
    
    for _, i in clothes :
        if i in clothes_hash :
            clothes_hash[i] += 1
        else :
            clothes_hash[i] = 2
    
    for i in clothes_hash.values():
        count *= i
    
    return count - 1

옷의 종류를 key 로 생각하여 해시 테이블을 생성한다.

조합을 구할 때는 (옷 종류별 개수 + 1) 끼리 곱해주면 된다.

옷 종류별로 하나의 옷만 입을 수 있기 때문에 개수가 경우의 수가 되고,

1을 더하는 이유는 옷을 안 입는 경우도 더해야 하기 때문이다.

그리고 전체 경우의수에서 -1을 해야 옷을 하나도 안 입는 경우를 빼야 한다.

 

 

다른 풀이

Counter

collections 모듈

리스트나 딕셔너리 안에 존재하는 원소의 개수를 세서 딕셔너리 자료형으로 반환한다. {'A':4}

 

reduce

functools 내장 모듈, 데이터에 집계 함수를 반복해서 계산해줌

reduce(집계 함수, 순회 가능한 데이터[, 초기값])

첫번째 인자는 accumulator, 두번째 인자는 현재값(current value)

 

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

[kind for name, kind in clothes] -> clothes 배열의 0번째 인덱스를 name, 1번째 인덱스를 kind 라 할 때

kind(종류) 에 대한 데이터들의 개수를 구하는 식이다.

그리고 reduce 함수를 통해 옷 종류 개수 + 1를 곱해나간다.

댓글