2021 KAKAO BLIND RECRUITMENT - 메뉴 리뉴얼
Updated:
Java
2021 KAKAO BLIND RECRUITMENT - 메뉴 리뉴얼
문제
접근 방법
orders 배열의 각 원소는 크기가 2 이상 10 이하인 문자열이므로, 각 손님들이 주문한 메뉴 들로 모두 조합을 하여도 시간 내 해결이 가능하다.
course 개수 만큼 모든 조합을 구한 뒤 그 조합의 개수를 Map으로 센다.
Map의 value(개수)를 기준으로 내림 차순으로 졍렬하여, 많이 주문된 메뉴 구성을 구한다.
코드
import java.util.*;
import java.util.Map.Entry;
class Solution {
static Map<String, Integer> menu;
static char sel[];
static int n, size;
public static String[] solution(String[] orders, int[] course) {
String[] answer = {};
ArrayList<String> result = new ArrayList<>();
for(int len : course) {
menu = new HashMap<>();
size = len;
sel = new char[size];
for(String str : orders) {
n = str.length();
DFS(0,0,str);
}
List<Entry<String, Integer>> list = new ArrayList<>(menu.entrySet()); // Map을 내림 차순으로 정렬한다.
Collections.sort(list, (o1,o2)->{
return -o1.getValue().compareTo(o2.getValue()); // Map의 value를 기준으로 정렬한다.
});
if(list.isEmpty() || list.get(0).getValue() < 2) // 손님은 단품메뉴를 2개 이상 주문해야 하므로, 예외 조건
continue;
int maxN = list.get(0).getValue();
for(Entry<String, Integer> en : list) { // 가장 많이 함께 주문된 메뉴 구성이 여러 개일 때
if(en.getValue() != maxN)
break;
result.add(en.getKey());
}
}
answer = new String[result.size()];
for(int i = 0; i < result.size(); i++) {
answer[i] = result.get(i);
}
Arrays.sort(answer);
return answer;
}
static void DFS(int lv, int start, String order) {
if(lv == size) {
char[] cl = sel.clone();
Arrays.sort(cl); // AC 아 CA가 다른 경우를 방지하기 위해, 오름차순 정렬한다.
String str = String.valueOf(cl); // 뽑은 단품 메뉴들로 조합을 만든다.
if(menu.containsKey(str)) // 메뉴 조합의 개수를 센다
menu.put(str, menu.get(str) + 1);
else
menu.put(str, 1);
return;
}
for(int i = start; i < n; i++) {
sel[lv] = order.charAt(i);
DFS(lv + 1, i + 1, order);
}
}
}