1. 문제


2. 나의 풀이


(의상 종류의 개수 1)을 모두 곱한 후 -1(아무것도 안 입었을 경우 제외) 하면 답을 구할 수 있으므로

먼저 첫 for 문을 통하여 clothes 배열에 있는 의상 종류의 개수를 세어주고

두 번째 for 문을 통하여 의상 조합의 개수를 구해주었다.

def solution(clothes):
    answer = {}
    for i in clothes:
        if i[1] in answer:
            answer[i[1]] += 1
        else:
            answer[i[1]] = 1
    
    cnt = 1
    for i in answer.values():
        print(i)
        cnt *= (i + 1)
    return cnt-1

3. 다른 풀이


개념은 동일 하지만 코드를 collections, functools 모듈을 사용하여 더 단순하게 작성하였다.

Counter를 사용하여 kind for name, kind in clothes 를 하게 되면

clothes의 요소 안의 두 번째 요소인 옷의 종류가 반환되고

그것들을 Count 해주게 된다. 그 후 lambda 함수를 사용하여 cnt 한 값들에 대하여

1 한 값을 곱하고 마지막으로 reduce 1 하여 반환한다.

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

4. 새로운 사실


파이썬에서는 lambda를 사용하여 함수를 보다 간결하게 작성 할 수 있다.

def add(x,y)
	return x+y
    
(lambda x,y: x + y)(10, 20)

map(), reduce(), filter() 등을 같이 사용하면 여러 가지 동작들을 수행할 수 있다.

#map(함수,리스트)
print(*map(lambda x: x**2,range(5)))
#range(5)의 숫자들을 lambda 함수 x**2에 넣어 출력
#즉 0~4까지의 숫자들의 제곱을 출력
#0 1 4 9 16

#reduce(함수,시퀀스,초기값)
from functools import reduce
reduce(lambda x, y: x + y, [0, 1, 2, 3, 4])
#[0,1,2,3,4]의 숫자들을 누적하여 lambda 함수에 적용한다 초기값을 설정하면 그것부터 시작.
#0+1=1 -> 1+2=3 -> 3+3=6 -> 6+4=10
#결과는 10
reduce(lambda x, y: y + x, 'abcde')
#b+a=ba -> c+ba=cba -> d+cba=dcba -> e+dcba=edcba
#결과는 edcba

#filter(함수,리스트)
list(filter(lambda x: x % 2, range(10)))   
#0~9까지중 x%2 해서 참,즉 1보다 큰 수가 나오는,
#2로 나누었을때 나머지가 1인 홀수들을 출력하게 된다.
#map을 사용하면 리스트의 숫자들이 변한 값이 나오고
#filter를 사용하면 리스트의 숫자들이 그대로 나온다.
print(*filter(lambda x:   x%2==0, range(10)))
#짝수를 출력하는 방법

5. 출처


위장

profile
배 터져 죽을 때까지

0개의 댓글