알고리즘

프로그래머스 메뉴 리뉴얼 (JAVA)

박카스마시며코딩 2021. 12. 27. 17:43

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

 

코딩테스트 연습 - 메뉴 리뉴얼

레스토랑을 운영하던 스카피는 코로나19로 인한 불경기를 극복하고자 메뉴를 새로 구성하려고 고민하고 있습니다. 기존에는 단품으로만 제공하던 메뉴를 조합해서 코스요리 형태로 재구성해서

programmers.co.kr

 

 

저는 map을 통해 조합할 수 있는 알파벳이 몇번 나왔는지를 확인하였습니다. 이를 iterator를 통해 가장 많이 나온 횟수를 구하고 그 값과 같은 횟수만큼 나온 메뉴를 결과에 넣어서 해결하였습니다.

import java.util.*;
class Solution {
    static Map<String,Integer>[] set;
    static void pick(StringBuilder sb,char[] orderChar,int number,int index,int depth,int start){
        if(depth == number){
            set[index].merge(sb.toString(), 1, (v,nv)-> v+1);
        }
        for(int i = start ; i < orderChar.length ; i++){
            sb.append(orderChar[i]);
            pick(sb,orderChar,number,index,depth + 1, i+1);
            sb.deleteCharAt(depth); 
        }
    }
    public String[] solution(String[] orders, int[] course) {
        String[] answer = {};
        set = new HashMap[course.length];
        for(int i = 0 ; i < course.length ; i++){
            set[i] = new HashMap<>();
        }
        for(String order : orders){
            char[] orderChar = order.toCharArray();
            Arrays.sort(orderChar);
            for(int i = 0 ; i < course.length ; i++){
                StringBuilder sb = new StringBuilder();
                pick(sb,orderChar,course[i],i,0,0);
            }
        }
        List<String> result = new ArrayList<>();
        for(int i = 0 ; i < set.length ; i++){
            int max = 0;
            for(Map.Entry<String,Integer> elem : set[i].entrySet() ){
                max = Math.max(max,elem.getValue());
            }
            // System.out.println("max:"+i+" "+max);
            if(max >= 2){
                for(Map.Entry<String,Integer> elem : set[i].entrySet() ){
                    if(elem.getValue() == max){
                        
                        result.add(elem.getKey());
                    }
                }
            }
        }
        answer = new String[result.size()];
        Collections.sort(result);
        for(int i = 0 ; i < result.size(); i++){
            answer[i] = result.get(i);
        }
        return answer;
    }
}