1 분 소요

key word : 조합, 해시맵

문제

여러 문자열과 조합의 개수가 주어지면, 가장 많이 나온 문자 조합을 리턴하는 문제이다. 지금까지 공부한 알고리즘이나 자료구조를 활용하면 그렇게 어렵지 않게 풀 수 있는 것 같다.



아이디어

가능한 메뉴 조합을 구하고 해시맵을 이용하여 가장 많이 나온 조합을 골랐다. 조합을 구할 때에는 스택을 사용했다.



구현

import java.util.HashMap;
import java.util.Stack;
import java.util.ArrayList;
import java.util.Arrays;

class Solution {
    public String[] solution(String[] orders, int[] course) {
        ArrayList<HashMap<String, Integer>> arr = new ArrayList<>();
        ArrayList<String> answers = new ArrayList<>();

        for(int c : course){
            HashMap<String, Integer> map = new HashMap<>();
            for(String s : orders){
                char[] chars = s.toCharArray();
                Arrays.sort(chars);
                dfs(0, 0, String.valueOf(chars), c, new Stack<String>(), map);
            }
            arr.add(map);
        }

        for(HashMap<String, Integer> map : arr){
            maxCource(map, answers);
        }

        String[] answer = new String[answers.size()];
        answers.toArray(answer);
        Arrays.sort(answer);

        return answer;
    }

    public void dfs(int k, int at, String order, int course, Stack<String> newCource, HashMap<String, Integer>map){
        if(k == course){
            makeHash(newCource, map);
            return;
        }

        int len = order.length();
        for(int i=at; i<len; i++){
            newCource.push(String.valueOf(order.charAt(i)));
            dfs(k + 1, i + 1, order, course, newCource, map);
            newCource.pop();
        }
    }

    public void makeHash(Stack<String> newCource, HashMap<String, Integer>map){
        String str = "";
        for(String s : newCource){
            str += s;
        }

        if(!map.containsKey(str)){
            map.put(str, 1);
        }else{
            map.put(str, map.get(str) + 1);
        }
    }

    public void maxCource(HashMap<String, Integer> map, ArrayList<String> answers){
        int max = getMaxValue(map);

        for(String s : map.keySet()){
            if(map.get(s) == max && max != 1){
                answers.add(s);
            }
        }
    }

    public int getMaxValue(HashMap<String, Integer> map){
        int max = 0;
        for(Integer i : map.values()){
            max = max < i ? i : max;
        }
        return max;
    }
}



후기

구현 문제를 자주 풀지 않았어서 괜히 긴장하며 풀이를 시작했다. 하지만 좀 보다보니 그리 어려운 문제는 아닌 것 같았다. 다만 일단 정답을 맞추자는 생각에 좀 무식하게 푼 면이 있다. 해시맵의 경우에도 리스트로 관리하지 않고 바로 처리해도 됐을 것 같은데, 이런 식으로 좀 불필요하게 사용된 자료구조들이 있는 것 같다. 다시 풀 때엔 좀 더 정리된 코드로 문제를 해결해봐야겠다.

업데이트: