카테고리 없음

의상 (해시는 개수를 셀때에도 이용된다.,문제에서 주어진 모든것을 쓸 필요는 없다)

성추 2025. 5. 18. 22:11

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

import java.util.*;
class Solution {
    public int solution(String[][] clothes) {
        Map<String,Integer> map = new HashMap<>();
        ArrayList<Integer> list = new ArrayList<>();
        for(String[] clothe : clothes){
            map.put(clothe[1],map.getOrDefault(clothe[1],0)+1);
        }
        for(String str: map.keySet()){
            list.add(map.get(str));
        }
        int answer=1;
        for(int i : list){
            answer = answer * (i+1);
        }
        return answer-1;
    }
}

이것도 못풀었으면 내 자존심에 상당히 스크레치가 있을 뻔 했다.

 

배웠던 getOrDefault를 사용해봤고 마찬가지로 Map 순회도 사용했다.

 

처음에는 직접 모든 경우의 수를 구해서 그 갯수를 카운트 하려고 했다.

 

하지만 이러다보니 모든 조합을 어떻게 뽑지? 의 문제가 생겼다.

 

이게 만약 코딩이 아닌 수학 문제집에서 봤다면

 

당연히 가능한 집합의 개수를 구하듯이 풀었을 것이다.

 

이런 상태일때는 

얼굴에서 나올 수 있는 경우의 수 3가지 (동그란 안경, 검정 선글라스 , 아예 택 X)

상의에서도 마찬가지로 2가지

하의 2가지

겉옷 2가지니까

3*2*2*2 = 24가지이다.이때 하나는 무조건 입어야되니까 24-1=23. 총 23가지이다.

 

이러면 간단해진다. 나는 input으로 들어온 각 종류의 갯수만 구하면 된다.

 

기존에는 당연히 배열이나 List로 갯수를 셌지만, 이러면 같은 종류에 대해서 그 종류가 나올때까지 배열이나 List를 탐색해야돼서 시간 손해를 볼 수 있다.

 

따라서 종류가 얼굴일 경우, map.put(얼굴, getOrDefault( map.get(얼굴),0)+1);

로 기존에 얼굴의 key가 없다면 1로 초기화, 아니면 새로 key,value를 만들어주면 된다.

 

이걸 다 해시로 저장시킨 후 Map을 순회해서 각각의 종류에 해당하는 옷들이 몇개 있는지 구하고

집합 개수를 구하면 된다.