๋ฐฑํธ๋ํน์ผ๋ก ์์ ์กฐํฉ์ ๊ตฌํ ๋ค, ์์ ์กฐํฉ ๋ณ ์ฃผ๋ฌธ ํ์๋ฅผ ๊ตฌํ๋ค. (bt() ๋ฉ์๋ ์ฌ์ฉ)
<์์ ์กฐํฉ, ์ฃผ๋ฌธํ์> ์ ๊ฐ์ด ์ ๋ ฅ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ๋งต์ ์ด์ฉํด์, <์ฝ์ค์ฌ์ด์ฆ, ์ฝ์ค ์ฌ์ด์ฆ์ ์ต๋ ์ฃผ๋ฌธํ์> ๋ฅผ ๊ตฌํ๋ค. (getMaxMenu())
๊ทธ๋ฆฌ๊ณ ์ฝ์ค์ฌ์ด์ฆ๋ณ ์ต๋ ์ฃผ๋ฌธํ์๋ฅผ ์๊ฒ ๋์ผ๋ฏ๋ก,
์ฝ์ค ์ฌ์ด์ฆ์ ์์ ์กฐํฉ์ ๊ธธ์ด๊ฐ ์ผ์นํ๋ฉด์ [์ฃผ๋ฌธํ์์ ์ต๋ ์ฃผ๋ฌธํ์๊ฐ ์ผ์นํ ๊ฒ & 2๋ฒ ์ด์ ์ฃผ๋ฌธ ๋]๊ฒ์ Max ๊ฐ์ ๋ฆฌ์คํธ ์๋ฃ๊ตฌ์กฐ์ธ ans์ ๊ธฐ๋กํ๋ค.
์ ๋ ฌํ ๋ค, ๋ฐฐ์ด๋ก ๋ณํํด์ ๋ฐํํ๋ค
import java.util.*;
class Solution {
HashMap<String,Integer> map;
HashMap<Integer,Integer> max;
List<String> ans;
StringBuilder sb;
public String[] solution(String[] orders, int[] course) {
map = new HashMap<>();
max = new HashMap<>();
ans = new ArrayList<>();
sb = new StringBuilder();
for(String order : orders){
for(int num : course){
bt(order,num,0);
}
}
getMaxMenu();
getAns();
return ans.toArray(new String[ans.size()]);
}
void getAns(){
for(Map.Entry<String,Integer> entry : map.entrySet()){
int len = entry.getKey().length();
if(max.get(len)==entry.getValue() && entry.getValue()>=2){
ans.add(entry.getKey());
}
}
Collections.sort(ans);
}
void getMaxMenu(){
for(Map.Entry<String,Integer> entry : map.entrySet()){
int len = entry.getKey().length();
max.put(len,Math.max(max.getOrDefault(len,0),entry.getValue()));
}
}
void bt(String order, int size, int start){
if(sb.length()==size){
char[] arr = sb.toString().toCharArray();
Arrays.sort(arr);
String menu = new String(arr);
map.put(menu,map.getOrDefault(menu,0)+1);
return;
}
for(int i=start;i<order.length();i++){
String menu = String.valueOf(order.charAt(i));
if(sb.indexOf(menu)>=0){
continue;
}
sb.append(menu);
bt(order,size,i+1);
sb.deleteCharAt(sb.length()-1);
}
}
}