[プログラマー]2021 KAKAO BLIND RECRUITMENT-メニュー更新


[プログラマー]2021 KAKAO BLIND RECRUITMENT-メニュー更新


私のアイデア

  • 21個のMap[]map=new HashMap[21]配列.
  • まず、各ユーザの注文メニューを昇順に並べます.
  • 個々の注文メニュー
  • を使用して、部分集合を作成します.
  • 注文
  • N個(2個以上)のメニューをmap[N]に入れます.
    すでに
  • がある場合は、1つの数を増やします.
  • がない場合は、値を1に追加します.
  • courseの値をマッピング配列のインデックスとして移動します.
  • キーがSet資料構造として受信された.
  • キーの値に移動し、最大値を検索します.
  • 最大値
  • に等しい鍵をPriorityQueue pqに入れる.
  • pqの寸法でStringアレイを作成します.
    Stringスキームを入力し、
  • ポーリングを行います.
  • Stringスキームを返します.
  • 正解



    Java Code

    import java.util.HashMap;
    import java.util.Map;
    import java.util.PriorityQueue;
    import java.util.Set;
    import java.util.Arrays;
    
    class Solution {
        
        static Map<String, Integer>[] map;
        
        public String[] solution(String[] orders, int[] course) {
            PriorityQueue<String> pq = new PriorityQueue<String>();
    		
    		int people = orders.length;
            for(int i=0; i<people; i++) {
    			char[] stringToChar = orders[i].toCharArray();
    			Arrays.sort(stringToChar);
    			orders[i] = new String(stringToChar);
    		}
            
    		map = new HashMap[21];
    		
    		for(int i=2; i<21; i++) {
    			map[i] = new HashMap<>();
    		}
    		
    		for(int i=0; i<people; i++) {
    			int menuCnt = orders[i].length();
    			boolean[] check = new boolean[menuCnt];
    			SubSet(orders[i], 0, 0, menuCnt, check);
    		}
    		
    		for(int i : course) {
                if(map[i].isEmpty()) continue;
                
    			Set<String> keys = map[i].keySet();
    			int max = 0;
    			for(String s : keys) {
    				if(map[i].get(s) > max) {
    					max = map[i].get(s);
    				}
    			}
    			
    			if(max < 2) continue;
    			
    			for(String s : keys) {
    				if(map[i].get(s) == max) {
    					pq.offer(s);
    				}
    			}
    		}
    		
    		int size = pq.size();
    		String[] answer = new String[size];
    		for(int i=0; i<size; i++) {
    			answer[i] = pq.poll();
    		}
    		
    		return answer;
        }
        
        private static void SubSet(String menu, int start, int cnt, int menuCnt, boolean[] check) {
    		if(start == menuCnt) {
    			if (cnt < 2) return;
    			
    			StringBuilder sb = new StringBuilder();
    			for(int i=0; i<menuCnt; i++) {
    				if(check[i]) {
    					sb.append(menu.charAt(i));					
    				}
    			}
    			
    			String combMenu = sb.toString();
    			if(map[cnt].containsKey(combMenu)) {
    				map[cnt].replace(combMenu, map[cnt].get(combMenu)+1);
    			}else {
    				map[cnt].put(combMenu, 1);
    			}
    			return;
    		}
    		
    		check[start] = true;
    		SubSet(menu, start+1, cnt+1, menuCnt,check);
    		check[start] = false;
    		SubSet(menu, start+1, cnt, menuCnt,check);
    
    	}
    }