스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.
예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다.
종류 | 이름 |
---|---|
상의 | 파란색 티셔츠 |
하의 | 청바지 |
겉옷 | 긴 코트 |
스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.
def solution(clothes):
a = {}
for i in range (0, len(clothes)):
if (clothes[i][1] not in a):
a[clothes[i][1]] = 1
else:
a[clothes[i][1]] = a[clothes[i][1]] + 1
이런식으로 옷의 개수를 세서 옷의 종류-개수 쌍을 가지는 딕셔너리를 만드는 것까진 생각했었지만 한 종류의 옷만 입는 경우, 두 종류의 옷만 입는 경우 이런식으로 세는 것으로 만들다가 결국 포기하고 구글링을 통해 답을 알아냈다.
def solution(clothes):
a = {}
for i in range (0, len(clothes)):
if (clothes[i][1] not in a):
a[clothes[i][1]] = 1
else:
a[clothes[i][1]] = a[clothes[i][1]] + 1
answer = 0
for i in a.values():
if answer == 0:
answer += (i + 1)
else:
answer *= (i + 1)
answer -= 1
return answer
처음 이 풀이를 봤을때 어떻게 이런식으로 생각을 한거지라는 생각이 들었다. 답을 유도하는 과정은 생각보다 단순했다. 예를 들어 {'headgear': 2, 'eyewear': 1} 인 경우가 있다고 생각해보자.
모든 경우의 수를 따져보면, (headgear를 쓰는 경우의 수(2) + 안쓰는 경우의 수(1)) * (eyewear를 쓰는 경우의 수(1) + 안쓰는 경우의 수(1)) - (아무것도 안 쓰는 경우의 수(1)) = 5로 깔끔하게 나온다. 이런식으로 문제를 더 깔끔하게 풀기 위해서는 더욱 분발해야 겠다는 생각이 들었다.