문제 설명
스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.
예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다.
종류 | 이름 |
---|---|
얼굴 | 동그란 안경, 검정 선글라스 |
상의 | 파란색 티셔츠 |
하의 | 청바지 |
겉옷 | 긴 코트 |
스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.
제한사항
해시 테이블을 이용했습니다.
해시 테이블(Hash Table): 키-값(key-value) 쌍으로 데이터를 저장하는 자료구조
처음 생각했던 문제 로직입니다.
1. 주어진 조건으로 해시 테이블을 만듭니다.(key: 종류, value: 이름)
2. 종류별 value 값의 옷 길이 리스트를 만듭니다.
3. 해시 테이블 길이 만큼 combinations 함수로 옷 길이 리스트에서 선택할 수 있는 경우의 조합을 구합니다.
4. 조합의 길이가 1이라면 total_cnt에 옷 길이를 더합니다.
5. 조합의 길이가 2 이상이라면 해당하는 조합의 옷길이를 모두 곱해 total_cnt에 더합니다.
시간초과....
이를 해결하기 위해서는 해시 테이블에서 값을 저장하지 않고, 옷의 종류마다 카운트만 저장하는 방식으로 수정해야 합니다.
따라서, 옷의 종류마다 카운트만 저장하는 방식으로 수정하고 옷을 선택하는 경우의 수의 시간복잡도를 해결하기 위해(원래 3중 for문) 각각의 경우에 선택 경우의 수 + 선택하지 않는 경우를 곱하는 방식을 생각했습니다.
def solution(clothes):
clothes_hash = {}
for cloth in clothes:
if cloth[1] not in clothes_hash:
clothes_hash[cloth[1]] = 1
else:
clothes_hash[cloth[1]] += 1
total_cnt = 1
for ch in clothes_hash.values():
total_cnt *= ch + 1
return total_cnt - 1
위 코드의 시간 복잡도는 O(n) 입니다.