[Java] 프로그래머스 : 의상

🤔 문제

🔗

코니가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.

👊 풀이과정

의상의 종류와 이름이 주어졌을 때, 중복 없이 입을 수 있는 경우의 수를 구하는 문제이다.
여기서 중요한 것은 의상 종류의 가짓수각 종류의 갯수이다.
 
의상 정보를 담기 위해 HashMap을 사용했다.
key에는 의상 종류가, 값에는 그 갯수가 들어간다.

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

 
map에 특정 종류 의상이 존재하는지 확인한다.
없을 경우 추가해주고, 이미 존재할 경우 값을 1 증가시킨다.

for(String[] c : clothes) {
    if(!map.containsKey(c[1])) {
        map.put(c[1], 1);
    } else {
        map.put(c[1], map.get(c[1])+1);
    }
}

 
이제 경우의 수를 구해야 하는데 여기서 중요한 것은 각 종류의 갯수, 즉 mapvalue들이다.
values()를 통해 값들을 컬렉션 객체로 반환하였다.
경우의 수를 계산할 때 요소의 값들을 차례로 읽어오기 위해 Iterator을 사용했다.

Iterator it = map.values().iterator();

while(it.hasNext()) {
    if(answer==0) answer = 1;
    answer *= (int)it.next()+1;
}
return answer-1;

경우의 수를 구할 때 조금 애를 먹었다💦
각각의 의상 종류는 입을 수도 있고 아예 입지 않을 수도 있기 때문에 원래 개수에서 1을 더해 곱해주었다.
모든 경우를 구한 결과값에서 아무것도 입지 않은 상태를 제외하기 위해 1을 뺀 후 리턴한다.

💻 소스코드

import java.util.*;

class Solution {
    public int solution(String[][] clothes) {
        int answer = 0;
        HashMap<String, Integer> map = new HashMap();
        
        for(String[] c : clothes) {
            if(!map.containsKey(c[1])) {
                map.put(c[1], 1);
            } else {
                map.put(c[1], map.get(c[1])+1);
            }
        }
        
        Iterator it = map.values().iterator();
        
        while(it.hasNext()) {
            if(answer==0) answer = 1;
            answer *= (int)it.next()+1;
        }
        return answer-1;
    }
}