호기심 많은 분석가

[프로그래머스] 해시 - 위장 (Python) 본문

Coding/Coding Test & Algorithm

[프로그래머스] 해시 - 위장 (Python)

DA Hun 2021. 6. 24. 16:02
 

코딩테스트 연습 - 위장

 

programmers.co.kr

from functools import reduce
def multiply(arr) :
    return reduce(lambda x, y : x*y, arr)
    
def solution(clothes):
    answer = {}
    for name, spe in clothes :
        if spe not in answer :
            answer[spe] = set()
        answer[spe].add(name)
    return multiply([len(answer[i])+1 for i in answer])-1

내 풀이

 이 문제는 살짝의 수학이 동반되면 쉬워진다. 모든 옷의 경우 입냐, 입지 않냐의 2가지의 경우로 나누어진다.

상의가 n가지 있을 경우 고르는 n가지와 입지 않는 1가지, 총 n+1의 경우의 수가 생긴다. 예를 들어 상의는 파란색과 노란색 티셔츠, 하의는 청바지가 있다면, [(파란색 상의), (파란색 상의, 청바지), (노란색 상의), (노란색 상의, 청바지), (청바지)]로 총 3*2-1=5가지의 경우의 수가 나옴. 

 따라서 식은 (옷가지의 수+1)들의 곱-1(아무것도 입지 않는 경우)로 세울 수 있다. 이때 sum과 비슷한 multiply 함수를 사용했음. sum의 경우 모든 원소의 합을 보여주는 만큼, multiplay함수는 reduce문법을 사용해서 모든 원소의 곱을 구해준다.

다른 풀이

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

 종종 느끼는 거지만 계속 Counter 라이브러리를 떠올림에도 불구하고 제대로 활용하지 못했다. 다른 분들의 풀이를 보며 Counter의 활용법도 배우고, 참 Counter가 유용하다는 것도 느낀다. 

 Counter에서 kind만 세어줌으로써 종류가 몇개 있는 지를 깔끔히 구현해낸다. 여러 번 보고 익힐만한 기술이다.