조합의 수를 보는 문제인것 같다. 순서는 중요하지 않고 어떤 종류들을 묶느냐가 중요한 문제인것 같다.
같은 카테고리를 묶어야 하므로 해시맵을 사용하여야 한다.
(key,value)
로 이루어진 쌍을 각각 (String ,Integer)
로 (카테고리, 나온수)
로 묶자
import java.util.HashMap;
HashMap<String,Integer> hashmap = new HashMap<>();
메소드
hashmap.put(key,value) //(해당key존재X)삽입,(해당Key존재)갱신
hashmap.containsKey(key) //해시맵에 key존재 여부
hashmap.get(key) //value 반환
각 옷들은 단독으로 사용될 수 있고 심지어 벌거벗고 모자만 쓰는 경우도 가능하므로 조합을 정할때 단독으로 사용되는 상황도 고려되어야 한다.
처음 나왔을때 1부터가 아닌 2
부터 시작한다면 단독으로 사용될때도 고려될 수 있을 것이다.
for(int i=0;i<clothes.length;i++){ //해당 의상 종류를 사용하지 않는 경우도 고려하여 0이 아닌 1부터 시작 int count = hashmap.getOrDefault(clothes[i][1],1); hashmap.put(clothes[i][1],count+1); // 1을 더하여 저장 }
이미 옷의 카테고리 clothes[i][1]
이 존재한다면 기존의 갯수를 꺼내와 1을 추가하고 갱신하다.
반면에 처음 나온 카테고리라면 1
이 아닌 2
로 추가한다.
while(iter.hasNext()){ answer *= iter.next(); } return answer - 1;
해시맵에 존재하는 값들을 읽어 와 곱한다.
예를 들어
(A,H),(B,H),(C,K),(D,L)이 있다고 가정하자
H종류는 2개, K종류는 1개, L종류는 1개 있으므로 각각
H 1 2
K 1
L 1
일까? 각각 단독으로 사용되는 경우도 고려하여야한다.
H 0 1 2
K 0 1
L 0 1
0은 단독으로 사용되고 1부터는 다른 종류와 조합될수 있다고 생각하면
1. A
2. B
3. C
4. D
5. A+C
6. A+D
7. B+C
8. B+D
9. C+D
10. A+C+D
11. B+C+D
3 * 2 * 2 - 1 = 11
만큼 조합할 수 있다.
import java.util.HashMap;
import java.util.Iterator;
class Solution {
public int solution(String[][] clothes) {
int answer = 1;
HashMap<String,Integer> hashmap = new HashMap<String,Integer>();
//각 의상의 종류마다 갯수를 구함
for(int i=0;i<clothes.length;i++){
//해당 의상 종류를 사용하지 않는 경우도 고려하여 0이 아닌 1부터 시작
int count = hashmap.getOrDefault(clothes[i][1],1);
hashmap.put(clothes[i][1],count+1); // 1을 더하여 저장
}
Iterator<Integer> iter = hashmap.values().iterator();
while(iter.hasNext()){
answer *= iter.next(); //수학적 접근 필요, 카테션 곱인듯?
}
return answer - 1;
}
}