알고리즘

[프로그래머스/Java] 위장 - Hashmap, 조합

명묭 2020. 9. 5. 02:04

Hashmap으로 푸는 문제라는건 알고 풀었고,.,,,

데이터셋이 아래처럼 나와서

arr[1] 의 값을 key값으로 넣고, value는 리스트를 넣어서 리스트에다 줄줄이 붙여넣었다.... 근데 리스트 할 필요없이 count만 하면 되겠네 지금 깨달음...

[[yellow_hat, headgear], [blue_sunglasses, eyewear], [green_turban, headgear]] 5
[[crow_mask, face], [blue_sunglasses, face], [smoky_makeup, face]] 3

일단 hashmap은 그렇게 활용했고,, hashmap으로 아이템을 정리한다음에 조합을 알아내야되는데

1~hashmap.size()개중 몇개를 입을지 정하고

종류가 선택되는거에 따라서 그 종류의 옷/아이템의 갯수를 또 곱해줘야되니까.. 막 머리가 아팠다.

배열에다가 key값 저장해서 조합한다음에 그 조합 결과에 따라서 각 key에 해당하는 value의 크기를 곱해줘서 다 더해서..,.,.,. 말로 쓰는것도 복잡하네........ 그래서 나온 코드가 아래코드고 한 한시간 한거같은데 계속 이곳저곳 걸리는 것 같아서 일단 딱 끊고 다른사람 코드 봤는데 엄청 간단함...ㅠㅠ 일단 망한 코드 먼저 올리면 아래와 같음.

import java.util.*;
class Solution {
    static int i,answer = 0;
    static int[] storage;
    public int solution(String[][] clothes) {
        Map <String, LinkedList<String>> hashmap = new HashMap<>();
        LinkedList <String> linkedlist;
        for(String[] each_clothes: clothes){
            if(hashmap.get(each_clothes[1])==null){
                linkedlist = new LinkedList<>();
                linkedlist.add(each_clothes[0]);
                hashmap.put(each_clothes[1],linkedlist);
            }else{
                // System.out.println(each_clothes[1]);
                linkedlist = hashmap.get(each_clothes[1]);
                linkedlist.add(each_clothes[0]);
                hashmap.put(each_clothes[1],linkedlist);
            }
        }
        
        // 옷 종류 조합
        //  --> 1개만 입을지, 2개입을지, ... (hashmap.size())개입을지 
        // 순서 의미X
        storage = new int[hashmap.size()];
        for(i=1; i<=hashmap.size(); i++){
            combination(0);   
            break;
        }
        
        // 각 종류별로 갖고있는 옷 중 어떤거 입을지..
        // --> hashmap.get(key[i]).length()?개 곱해주기
        
        
        System.out.println(hashmap.toString());
        System.out.println(hashmap.size());        
        return answer;
    }
    static public void combination(int cnt){
        if(cnt == i){
            storage
            // answer += 
        }
        
        System.out.println("테스트");
    }
}

그 다른사람 블로그에서 본 방법은 1,2,3, ... n개 고르는 경우를 다 고려하는게 아니었다.. 각 종류를 고른다/안고른다로 생각하는거였다..ㅠㅠ 각 종류를 고른다/안고른다로 생각하면 (item종류의 수*각 item종류의 옷/아이템 갯수)^2만큼에 경우의수가 생김.... 하나도 안입을 순 없어서 마지막에 -1 해주면 된다....고함.... 나 인적성 할때도 이부분 가끔 놓쳐서 헤매고 그랬는데 코딩하면서도 헤매넼ㅋㅋㅋㅋ

 

(item종류의 수*각 item종류의 옷/아이템 갯수)^2만큼에 경우의수  > (item 종류의 수 + 1) 

왜냐하면, 그 종류를 선택했을 때만 item 종류의 수를 곱해주는거고, 그 종류를 선택하지 않는 경우의 수는 그냥 1이기때문.

import java.util.*;
class Solution {
    public int solution(String[][] clothes) {
        Map <String, Integer> hashmap = new HashMap<>();
        int answer = 1;
        int temp = 0;
        for(String[] each_clothes: clothes){
            if(hashmap.get(each_clothes[1])==null){
                hashmap.put(each_clothes[1],1);
            }else{            
                temp = hashmap.get(each_clothes[1])+1;
                hashmap.put(each_clothes[1],temp);
            }
        }
        System.out.println(hashmap.toString());
        for(String keys : hashmap.keySet()){
            System.out.println(hashmap.get(keys)+1);
            answer *= hashmap.get(keys)+1;
        }
        answer-=1;
        return answer;
    }
}