티스토리 뷰

https://programmers.co.kr/learn/courses/30/lessons/42578

 

코딩테스트 연습 - 위장

 

programmers.co.kr

풀이법: 주어진 입력을 java 해시맵으로 <종류, 종류의 개수> 형태로 저장한다. 그 후 조합의 개수를 찾아서 반환한다.

Comment:

1)  예를 들어 하의 종류 중 청바지인지 검은 슬랙스인지 그 구체적인 내용은 아무 상관이 없다.

2)  이 문제는 사실 조합의 개수를 찾는 방법이 제일 어려운 부분이다.

     공식화 한다면 대충 다음과 같다. 3종류의 의상이 주어진다 하면:

     총 경우의 수 = (종류1 개수 + 1) X (종류2 개수 + 1) X (종류3 개수 + 1) - 1

    

     +1의 의미: 예를들어 종류1의 의상이 총 4가지가 있을 경우에 그 중 1가지를 선택하는 경우의 수는 4이다. 하지만 문제 조건에서

     종류1의 의상을 선택하지 않을 수도 있기 때문에 종류1에 대해선 총 5가지의 경우의 수가 나온다.

     

     -1의 의미: 앞서 모든 종류마다 +1을 해준다고 하자. 이 중 한가지 경우의 수는 아무 의상도 선택하지 않은 경우의 수가 존재한다. 이에 경        우는 배제해야 하므로 총 경우의 수에서 -1을 해줄 필요가 있다.

 

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;

class Solution {
    public int solution(String[][] clothes) {
        HashMap<String, Integer> types = new HashMap<String, Integer>();
        
		for(int i = 0; i < clothes.length; i++) {
            if(types.containsKey(clothes[i][1])) {
                int count = types.get(clothes[i][1]) + 1;
				types.put(clothes[i][1], count);
			}else {
				types.put(clothes[i][1], 1);
			}
			 
		}
        
        Iterator<String> keys = types.keySet().iterator();
		
		int answer = 1;
		while(keys.hasNext()) {
			String key = keys.next();
			int temp = types.get(key);
			answer = answer * (temp+1);
        }
		answer = answer - 1;       
        return answer;
    }
}