[프로그래머스] 위장 Python

김아현·2022년 4월 23일
0

문제 보기

🔒 문제

🔐 해결 과정

  1. 경우의 수를 구하는 문제이므로 해시를 사용해서 푼다!
  2. 의상의 종류를 키로 같은 종류의 의상 수를 값으로 하는 해시 자료구조를 만든다.
  3. 모든 경우의 수 = (1번 의상 종류의 의상 수 + 1) (2번 의상 종류의 의상 수 + 1) ... (n번 의상 종류의 의상 수 + 1) 의 공식을 활용해 전체 경우의 수를 구한다.
    => 각 카테고리의 의상 수에 1을 더한 것은 아무것도 입지 않았을 경우를 뜻한다.
  4. (위 사진에선 잘렸지만) 스파이가 하루에 최소 하나의 옷은 입는다고 가정하고 있으므로 아무것도 입지 않는 경우를 빼주는 의미로 -1 한다.

🔓 풀이 (40m)

2020.

from collections import Counter
def solution(clothes):
    answer = 1
    kinds = Counter(i[-1] for i in clothes)
    for i in kinds.values():
        answer *= (i+1)
    return answer - 1

2022.04.23

def solution(clothes):
    closet = {}
    for name, kindOf in clothes:
        if(kindOf in closet):
            closet[kindOf] = closet.get(kindOf) + 1
        else:
            closet[kindOf] = 1
    result = 1;
    for v in closet.values():
        result *= (v+1)
    return result-1

🔁 feedback

자바스크립트로 문제를 풀어오다가 오랜만에 파이썬으로 풀어보니 헷갈리지만 라이브러리 사용하지 않고 푸는게 좀 편해진 것 같기도 하다.

+ 다른 사람의 풀이

✔️ reduce() 사용

import collections
from functools import reduce

def solution(c):
    return reduce(lambda x,y:x*y,[a+1 for a in collections.Counter([x[1] for x in c]).values()])-1

코드 순서 : ③reduce( lambda, ②Counter(①).values() ) ④ - 1
Counter 내부(①)에서 의상 종류에 따른 의상 수를 카운트한 뒤 Counter 외부(②)의 for문에서 각 값들을 1씩 증가한다. reduce(③)에서 배열 안의 값들을 모두 곱한다. 마지막(④)으로 아무 옷을 입지 않은 경우를 빼준다.

profile
Want to be backend developer

0개의 댓글