Algorithm/Programmers

[Python] 위장

느낌표 공장장 2021. 6. 2. 22:48
def solution(clothes):
    dic = {}
    for i in clothes :
        if i[1] in dic :
            dic[i[1]] += 1
        else :  
            dic[i[1]] = 2
            
    answer = 1       
    for j in dic.values() :
        answer *= j
        
    return answer -1

풀이

의상 종류를 세어 경우의 수를 구해주면 된다.

 

1. dic에 의상 종류에 따라 저장하고 해당 종류가 또 있다면 1을 더해준다.

2. dic에 저장된 의상 종류들의 모든 값(수)들을 곱하고 -1하여 반환한다.

* 2부터 시작하고 -1하는 이유 :

  의상종류가 3가지라고 가정했을 때, (a + 1)(b + 1)(c + 1) - 1 = (a + b + c) + (ab + bc + ca) + abc

 


다른 풀이

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

1. Counter 함수로 데이터의 개수(의상 종류)를 센다.

  • Counter는 데이터의 개수를 구할때 사용한다.
  • ex) 테스트케이스 1번을 돌려보면 cnt = Counter({'headgear': 2, 'eyewear': 1})

2. reduce 함수를 이용해 cnt의 values 값들에 +1을 더하여 곱한다음 -1을 해준다.

  • functools 내장 모듈 reduce() 함수는 여러개의 데이터를 대상으로 누적 집계를 내기 위해 이용한다.
  • reduce(집계 함수, 순회 가능한 데이터[, 초기값])
  • 기본적으로 초기값을 기준으로 데이터를 루프 돌면서 집계 함수를 계속해서 적용하면서 데이터를 누적하는 방식으로 작동한다.

'Algorithm > Programmers' 카테고리의 다른 글

[Python] 큰 수 만들기  (0) 2021.06.06
[Python] 다리를 지나는 트럭  (0) 2021.06.04
[Python] 메뉴 리뉴얼  (0) 2021.06.02
[Python] 뉴스 클러스터링  (0) 2021.05.28
[Python] 소수 찾기  (0) 2021.05.27