[프로그래머스][해시] 위장

sewonK·2021년 7월 26일
0

내가 푼 풀이

def solution(clothes):
    answer = 1
    category = dict()
    for cloth in clothes:
        if cloth[1] in category:
            category[cloth[1]] +=1 
        else:
            category[cloth[1]] = 1
    for i in category:
        answer *= (category[i] + 1)
        
    return answer - 1

이 문제는 알고리즘보다는 수학적인 능력을 좀 더 보는 듯 했다. 쉬운 경우의 수 구하기 문제인데, 전체 경우의 수(옷을 입지 않는 것 포함) - 1(옷을 전부 입지 않았을 때) 로 구하면 쉽다.

이 문제도 defaultdict 함수를 import해서 사용하면 if else문 없이 깔끔하게 풀이가 가능하다!

Best 풀이

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

베스트 풀이인데, 생각보다 직관적이지 않다. reduce 함수에 익숙하지 않아서 그럴지도? 사실 그렇게 베스트인지는 잘모르겠다.

reduce

Reduce 함수는 functools 모듈에서 임포트해서 사용할 수 있다.

reduce(function, iterable, initializer=None)

iterable을 돌면서 function을 수행하는 함수이다. 초기값도 지정해줄 수 있다.

풀이에서의

answer = reduce(lambda x, y: x*(y+1), cnt.values(), 1) - 1

를 자세히 뜯어보면,
1. cnt는 Counter함수의 리턴값으로, clothes 리스트 내 (name, kind) 형태 중 kind를 기준으로 개수를 센 dict 형식이다. cnt는 Counter({'headgear': 2, 'eyewear': 1})이며, cnt.values는 dict_values([2, 1]) 이다.
2. 초기값 1 * (cnt.values() + 1)의 형식으로 reduce를 통해 값을 구하고, 전체에서 -1을 해주는 방식이다.

전체적인 풀이 방법 자체는 나의 풀이와 비슷했으나, counter, reduce 함수를 사용하는 것에 있어 좀 달랐다.

특히 counter 함수는 해시 문제 풀이에서 굉장히 자주 등장하기 때문에, 꼭 익혀두어야겠다.

0개의 댓글

Powered by GraphCDN, the GraphQL CDN