스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.
예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다.
종류 | 이름 |
---|---|
얼굴 | 동그란 안경, 검정 선글라스 |
상의 | 파란색 티셔츠 |
하의 | 청바지 |
겉옷 | 긴 코트 |
스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.
HashMap
을 통해, 해당 종류의 옷을 안입었을 경우를 포함한 옷의 종류별 입을 수 있는 가짓수(경우의 수)를 저장하고, 이를 모두 곱하여, 해당 옷들을 조합하여 입을 수 있는 모든 경우의 수를 구한 후, 이중에서 아무것도 안입었을 경우를 제거한 뒤 반환한다.
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
public class Solution {
public int solution(String[][] clothes) {
Map<String, Integer> map = new HashMap<>();
for(String[] cloth : clothes)//옷에 대한 정보를 이터레이션한다.
map.put(cloth[1], map.getOrDefault(cloth[1], 0) + 1); //옷의 종류별로 몇개의 옷이 있는지를 저장한다.
AtomicInteger answer = new AtomicInteger(1); //lambda 를 통한 연산을 위해 사용
//해당 분류의 옷을 입지 않는 경우를 포함한 모든 경우의수를 곱한다.
map.forEach((k, v) -> answer.updateAndGet(v1 -> v1 * (v + 1)));
return answer.get() - 1; //아무것도 입지 않은 경우를 제외한다.
}
}
어째 같은 레벨인 전화번호 목록보다 훨 쉬운 느낌이 든다
정확성 테스트 및 효율성 테스트를 전체 통과하였다