[Algorithm] 문제풀이 - 해쉬-9
위장 [Lv.2]
스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return
입출력
- 입력 : [의상의 이름, 의상의 종류] 의 배열
- 출력 : 서로 다른 옷의 조합의 수
제한사항
- clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다.
- 스파이가 가진 의상의 수는 1개 이상 30개 이하입니다.
- 같은 이름을 가진 의상은 존재하지 않습니다.
- clothes의 모든 원소는 문자열로 이루어져 있습니다.
- 모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 ‘_’ 로만 이루어져 있습니다.
- 스파이는 하루에 최소 한 개의 의상은 입습니다.
풀이
import java.util.*;
class Solution {
public int solution(String[][] clothes) {
int answer = 1;
Map<String, Integer> map = new HashMap<>();
for(int i=0;i<clothes.length;i++){
map.put(clothes[i][1], map.getOrDefault(clothes[i][1], 0) + 1);
}
// value 경우의 수 + value 중 어떤 것도 선택하지 않는 경우(1)
for(int value : map.values()){
answer *= ( value + 1 );
}
// 전체 경우의 수에서 아무것도 선택하지 않은 경우(1)를 뺀다.
return answer - 1 ;
}
}
e.g. Map 이 아래일 경우, answer = 5
Headgear : redhat, bluehat
eyewear : sunglass
| Key | Value |
|---|---|
| Headgear | 2 |
| Eyewear | 1 |
가능한 경우의 수
redhat, bluehat, none (3)
sunglass, none (2)
3 * 2 -1(all none) = 5
다른 사람의 풀이 (람다 사용)
import java.util.*;
import static java.util.stream.Collectors.*;
class Solution {
public int solution(String[][] clothes) {
return Arrays.stream(clothes)
.collect(groupingBy(p -> p[1], mapping(p -> p[0], counting())))
.values()
.stream()
.collect(reducing(1L, (x, y) -> x * (y + 1))).intValue() - 1;
}
}
reducing(1L, (x, y) -> x * (y + 1))
reducing (초기화 값, (이전값, 다음값) → 계산식)
초기화 값을 지정하고, 누적으로 계산식을 적용한다 예) x : 이전 값, y : 다음 값