1 분 소요

코딩테스트 연습 - 위장

위장 [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 : 다음 값