스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.
예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다.
종류 | 이름 |
---|---|
얼굴 | 동그란 안경, 검정 선글라스 |
상의 | 파란색 티셔츠 |
하의 | 청바지 |
겉옷 | 긴 코트 |
스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.
clothes | return |
---|---|
[['yellow_hat', 'headgear'], ['blue_sunglasses', 'eyewear'], ['green_turban', 'headgear']] | 5 |
[['crow_mask', 'face'], ['blue_sunglasses', 'face'], ['smoky_makeup', 'face']] | 3 |
예제 #1
headgear에 해당하는 의상이 yellow_hat, green_turban이고 eyewear에 해당하는 의상이 blue_sunglasses이므로 아래와 같이 5개의 조합이 가능합니다.
예제 #2
face에 해당하는 의상이 crow_mask, blue_sunglasses, smoky_makeup이므로 아래와 같이 3개의 조합이 가능합니다.
def solution(clothes):
cloth_dic = dict()
for cloth in clothes:
if cloth[1] not in cloth_dic.keys():
cloth_dic[cloth[1]] = 1
else:
cloth_dic[cloth[1]] += 1
result = 1
for value in cloth_dic.values():
result *= value + 1
answer = result - 1
return answer
경우의 수를 이용해서 풀었다고 생각할 수 있다.
입출력 예제 1번을 보면서 headgear가 2개 eyewear가 1개인데 이를 1씩 더하고(착용 안 한 상태를 더하기 위해), 나온 값을 곱한 후 1(둘다 0인 경우)를 빼면 나올 것이라고 생각했다.
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
나랑 똑같이 경우의 수를 사용한 식인데 내가 for 문과 if 문을 돌면서 생성한 딕셔너리를 Counter를 이용해서 생성했다. 다음에는 Counter를 생각해낼 수 있으면 좋겠다..
그 후, 현재 Counter({'headgear':2, 'eyewear': 1})인 상태이므로 headgear의 경우 2 x (1 + 1) = 4, eyewear인 경우 1 x (1 + 1) = 2이고, reduce로 인해 둘의 합이 구해지고 -1을 하면 5가 나온다.
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
이번으로 해시 3번째 문제 풀이였는데 사실 1, 2번보다 속도도 빨리나오고, 나랑 유사하게 작성한 코드들의 댓글에 해시를 이용한 정석 풀이 같다는 얘기에 기분이 좀 좋다 ㅎㅎ 다음에도 효율적인 코드를 짤 수 있도록 노력해야지