스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.
예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다.
종류 | 이름 |
---|---|
얼굴 | 동그란 안경, 검정 선글라스 |
상의 | 파란색 티셔츠 |
하의 | 청바지 |
겉옷 | 긴 코트 |
스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.
clothes | return |
---|---|
[["yellowhat", "headgear"], ["bluesunglasses", "eyewear"], ["green_turban", "headgear"]] | 5 |
[["crowmask", "face"], ["bluesunglasses", "face"], ["smoky_makeup", "face"]] | 3 |
def solution(clothes):
cloth_table = {}
for cloth in clothes:
if cloth[1] in cloth_table:
cloth_table[cloth[1]] += 1
else:
cloth_table[cloth[1]] = 1
count = 1
for num_of_cloth in cloth_table.values():
count *= (num_of_cloth + 1)
return count - 1
우선, 옷은 같은 종류끼리는 동시에 착용이 불가능하다는 점을 토대로 각 종류별로 옷의 개수별로 경우의 수를 구할 수 있을 것이라 생각했다.
머리에 해당하는 옷이 1개 뿐이라면 그 옷을 입는 경우와 안 입는 경우, 총 2가지의 경우가 생긴다.
머리에 해당하는 옷이 2개(A, B)라면 A를 입는 경우, B를 입는 경우, 안 입는 경우 총 3가지의 경우가 생긴다.
머리에 해당하는 옷이 3개(A, B, C)라면 A를 입는 경우, B를 입는 경우, C를 입는 경우, 안 입는 경우 총 4가지의 경우가 생긴다.
즉, 같은 종류의 옷이 n개 있다면 총 n + 1가지의 경우가 생긴다.
그렇다면, 이 공식을 입출력 예제에 적용시켜보자.
[["yellowhat", "headgear"], ["bluesunglasses", "eyewear"], ["green_turban", "headgear"]]
의 경우 headgear가 2개이므로 3가지, eyeware가 1개이므로 2가지가 생긴다.
[["crowmask", "face"], ["bluesunglasses", "face"], ["smoky_makeup", "face"]]
의 경우 face가 3개이므로 4가지의 경우가 생긴다.
두 가지 케이스 모두 각 옷의 종류별로 생기는 경우의 수를 곱한 다음 1을 빼주면 return value와 동일한 값을 얻을 수 있다.
첫 번째 예제의 경우 2 * 3 - 1 = 5이며, 두 번째 예제의 경우 4 - 1 = 3이다.
그렇다면 왜 마지막에 1을 빼야 하는 걸까? 그 이유는 제약 조건의 마지막 문장을 읽으면 알 수 있다.
스파이는 하루에 최소 한 개의 의상은 입습니다.
즉, 각 옷의 종류에서 "안 입는다"라는 선택지를 고른 경우, 어떠한 분장 도구도 착용하지 않는 경우가 생기는데, 이는 문제에서 요구하는 경우에 부합하지 않기 때문에 이를 제외해야 하므로 1을 빼야 하는 것이다.