알고리즘

프로그래머스 레벨2 해시 - 의상

JUNGKEUNG 2024. 7. 3. 21:47
반응형

 

 

풀이 과정

map을 이용하여 옷의 종류당 개수로 데이터를 세팅해야한다. 아직 추가된 옷의 종류가 없다면 해당 종류의 옷을 1개로 넣고 이미 해당 종류의 옷이 있다면 원래 종류에서 1개를 추가 해야한다.

        for(int i =0; i<clothes.length; i++){
        	//의상종류, 갯수
            clothesMap.put(clothes[i][1], clothesMap.getOrDefault(clothes[i][1], 0)+1);
        }

 

 

 

map에 들어 있는 옷의 종류당 개수를 모두 곱하면 옷의 조합의 수를 구할 수 있는데, 이때 옷의 종류마다 해당 종류를 고르지 않는 경우가 있기 때문에 옷의 종류당개수에 1을 더하여 곱해줘야한다.

      String[] keys = clothesMap.keySet().toArray(new String[0]);
        for (int i = 0; i < keys.length; i++) {
            answer *= clothesMap.get(keys[i]) + 1;
        }

 

 

 

문제의 조건에서 스파이는 하루에 최소 한 개의 의상은 입는다는 조건이 있으므로 옷을 하나도 고르지 않는 경우를 제외해야한다.

return answer-1; //아무것도 안입는 경우의 수 제거

 

 

 

문제 코드

class Solution {
    public int solution(String[][] clothes) {
        int answer = 1; //곱셈을 위해 1로 선언
        HashMap<String, Integer> clothesMap = new HashMap<String, Integer>();
        //map 구하기
        for(int i =0; i<clothes.length; i++){
        	//의상종류, 갯수
            clothesMap.put(clothes[i][1], clothesMap.getOrDefault(clothes[i][1], 0)+1);
        }
        //조합
      String[] keys = clothesMap.keySet().toArray(new String[0]);
        for (int i = 0; i < keys.length; i++) {
            answer *= clothesMap.get(keys[i]) + 1;
        }
     
        return answer-1; //아무것도 안입는 경우의 수 제거
    }
}

 

 

다른 사람 문제 풀이

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

 

 

 

 

정리

이 문제는 경우의 수를 생각하여 문제를 풀어야한다. 

같은 종류의 의상이 있는지, 추가된 옷이 있는지, 종류의 옷을 고르지 않았을때의 수를 생각해야 한다. 같은 종류의 의상은 1개밖에 못입기 때문에 n 중에 1개 (혹은 0개도 있을수도 있다) 으로 접근을 해야한다.

만약 모자 종류 3개, 상의 종류 3개, 바지 종류 3개 이런식으로 되어있다면, 모자를 1개를 입거나 말거나, 상의 1개를 입거나 말거나, 바지 1개를 입거나 말거나 의 경우의 수로 나눠지는데 여기서 셋다 말거나를 빼준 경우가 return문에 나오는 수가 된다. 

 

 

 

자료

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