https://programmers.co.kr/learn/courses/30/lessons/72411
풀긴 풀었는데 비효율적인 방법으로 풀어서 다시 풀어보았다.
처음 풀었을 때는 좀 멍청하게 풀었다. 등장한 알파벳으로 가능한 모든 조합을 만들었는데 그럴 필요가 전혀 없었다.
그냥 order 를 돌면서 course 에 제시된 숫자로 조합을 만들어 객체에 저장한 다음, course 별로 가장 등장횟수가 큰 놈만 answer 에 넣으면 되었다.
처음부터 이렇게 생각했으면 금방 풀렸을 텐데, 복잡하게 생각한 나머지 테스트케이스가 시간초과 나기도 했다...
어쨌든 끝에서 좋은 방법을 찾아서 다행이다.
function solution(orders, course) {
let answer = [];
// 조합을 만드는 함수이다.
function combination(str, count) {
let arr = []
function DFS(L, S, sum) {
if (L === count) arr.push(sum);
else {
for (let i = S; i < str.length; i++){
DFS(L+1, i+1, sum + str[i])
}
}
}
DFS(0, 0, '');
return arr;
}
// 조합: 등장횟수를 저장하는 객체
let candidatesMap = {};
// 각 요리마다 가능한 조합을 만들어서 등장횟수를 센다.
for (let i = 0; i < orders.length; i++) {
let sorted = orders[i].split('').sort()
for (let j = 0; j < course.length; j++) {
if (orders[i].length < course[j]) continue;
let arr = combination(sorted, course[j]);
for (let x of arr){
if (candidatesMap[x]) candidatesMap[x]++;
else candidatesMap[x] = 1;
}
}
}
// 메뉴 개수별로 제일 많이 등장한 조합을 찾아 answer 에 넣는다.
for (let dishcount of course) {
let max = 0;
for (let key in candidatesMap) {
// 1번 등장한 조합은 제거한다.
if (candidatesMap[key] === 1) {
delete candidatesMap[key];
continue;
}
if (key.length === dishcount) {
if (candidatesMap[key] > max) max = candidatesMap[key];
}
}
for (let key in candidatesMap) {
if (key.length === dishcount &&
candidatesMap[key] === max) {
answer.push(key)
}
}
}
return answer.sort();
}