문제출처


import java.util.*;

class Solution {
    public int solution(String[][] clothes) {

        HashMap<String,Integer> map = new HashMap<>();

        for(String[] clothe : clothes){
            String type = clothe[1];
            map.put(type, map.getOrDefault(type,0) + 1);
        }

        Iterator<Integer> it = map.values().iterator();
        int answer = 1;

        while(it.hasNext()){
            answer *= it.next().intValue() + 1;
        }

        return answer - 1;
    }
}


접근방법

여러 종류의 옷이 있고 각 종류별로 1개 이하를 입을 수 있다면 몇 가지의 옷이 가능하냐는 문제이다.

Ex) headgear = 2 , eyewear = 1 위와 같은 상황이라면 Headgear는 총 2개 있으니, 총 3가지의 경우의 수가 있다. 1번입기, 2번입기, 아무것도 입지 않기 Eyewear는 총 1개 있으니, 총 2가지의 경우의 수가 있다. 1번입기, 입지 않기

그렇다면 총 3 x 2 가지의 경우의 수 인 6가지가 존재한다. 이 중 한가지는 headgear도 입지 않고 eyewear도 입지 않은 경우가 되기 때문에 이 경우를 제외하여 5가지 정답이 된다.

Hash를 통해 각 type별로 가짓수를 계산하고, 총 경우의 수를 산출한다.


HashMap<String, Integer> map = new HashMap<>();
for(String[] clothe : clothes){
	String type = clothe[1];
	Map.put(type, map.getOrDefault(type, 0) + 1);
}

//map.getOrDefault = 찾는 키가 존재한다면 찾는 키의 값을 반환하고 없다면 기본 값을 반환하는 메서드 getOrDefault(Object key, V DefaultValue); map.getOrDefault(값을 가져와야 하는 요소의 키, 지정된 키로 매핑된 값이 없는 경우 반환되어야 하는 기본값)

즉 해당 코드를 해석해보면 문자열 배열을(String[ ]) clothe라고 부를거고, 받은 2차원 배열clothes[ ][ ]를 0부터 끝까지 for문을 반복하고, 반복문이 한번 돌때마다 type이라는 변수에 clothe의 1번 인덱스에서 어떤 종류인지 값을 가져와서 저장해준다.

그리고 map에 값을 저장하는데 기존 맵에 이키값으로 저장된 애가 있다면 이미 한번 저장된것을 의미하기 때문에 총 개수를 구해야하니 저장된 값을 가져와서 + 1을 해주었다.

만약에 없다면(처음 map에 저장하는경우) 0 + 1 == 1을 저장한다.

다음 코드를 보면

Iterator<Integer> it = map.values( ).iterator( );
Int answer = 1;

**Iterator<데이터타입> iterator명 = 컬렉션.iterator();** java에서 Iterator는 다음과 같이 사용하는데 Iterator는 처음부터 끝까지 단방향으로 반복가능하다.

Integer데이터 타입의 it라는 iterator에 map.values().iterator(); =>저장해놓은 숫자들을 가져와서 저장한다. 아래에서 곱하기를 할거기 때문에 Int형 answer이라는 변수를 1로 초기화하며 선언해주었다.

이후 해당 코드를 보면


while(it.hasNext( )){
	answer *= it.next( ).intValue( ) + 1;
}

아까 저장해놓은 it라는 iterator를 활용하여 it.hasNext()를 사용하여서 Iterator안에 다음 값이 들어있는지를 확인한다. 있다면 true, 없다면 false를 반환한다. 즉, 해당 while문은 다음 값이 들어 있지 않다면 종료된다.

아까 위에서 구한 공식이 의상 개수 + 안입었을경우 * 의상 개수 + 안입었을 경우였기 때문에 종류가 상의, 하의, 얼굴, 신발 이라면 상의+1 * 하의+1 * 얼굴+1 * 신발+1 = (총 경우의수)가 된다. 그렇기 떄문에 answer * = it가 가진 다음의 값 가져오기.Integer객체에서 int형 값을 뽑아내는 메소드 + 1(입지 않는 경우)로 구현하였다.

아무종류의 옷도 입지 않은 경우는 없기 때문에 마지막으로 값을 return 할 때 -1을 해주었다.