문제 :
스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.
예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다.
종류 이름
얼굴 | 동그란 안경, 검정 선글라스 |
상의 | 파란색 티셔츠 |
하의 | 청바지 |
겉옷 | 긴 코트 |
스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.
자세한 문제는 링크를 참조하세요.
입출력 예

해결방법
경우의 수로 접근하였다.
모든 경우의 수 - 전부 다 없는 경우

Point 장착하지 않는 경우 :
모든 종목 중에 한 종목만 장착해도 된다 함은 전체 경우의 수에서 모두 장착하지 않는 경우를 제거해주면 된다.
즉, 들어온 들어온 종목의 개수에 + 1을 하여 각 종목들을 곱해주면 전체 경우의 수가 나오고,
잊지 말고 마지막에 -1을 해줘야 한다.
공식으로 나타내 보면,
m: 얼굴에 들어온 품목의 개수
n : 상의에 들어온 품목의 개수k : 하의에 들어온 품목의 개수
answer = (m+1)(n+1)(k+1) - 1
코드로 확인해 보자
1.PYTHON VERSION
def solution(clothes):
answer = 1
dict = {} // 딕셔너리에 value가 여러개인 구조로 만들었다.
for element in clothes:
if element[1] not in dict:
dict[element[1]]=[] // 없으면 value에 리스트로 만들고 있으면 더하는 방식
dict[element[1]].append(element[0])
for key, value in dict.items():
answer *= len(value)+1
return answer - 1
2. JAVA VERSION
처음엔, value 값을 숫자가 아닌 String []으로 접근했는데 자료 구조를 다루는 것이 쉽지 않았다.
어차피 우리가 필요한 것은 각 키 별로 value의 개수 이므로 다루기 쉬운 방식으로 접근해보았다.
import java.util.*;
class Solution {
public int solution(String[][] clothes) {
int answer = 1;
int value = 1;
Map<String, Integer> hm = new HashMap<>();
for (String[] col: clothes){
if(hm.containsKey(col[1])){// 키가 있으면 키값을 가져와서 1을 더해서 value에 넣어줬다.
int flag = hm.get(col[1]) + 1;
hm.put(col[1], flag);
}
hm.putIfAbsent(col[1], value);// 키가 없으면 1을 넣고
}
for(Integer i : hm.values()){// 값을 answer 에 곱해준다.
answer *= i+1;
}
return answer - 1;
}
}