JavaScript로 순열과 조합 알고리즘 구현하기 를 통해 조합에 대한 알고리즘을 공부했습니다.
const getcombination = (arr, selectNum) => {
const result = [];
if (selectNum === 1) return arr.map((element) => [element]);
arr.forEach((fixed, index, origin) => {
const rest = origin.slice(index + 1);
const combination = getcombination(rest, selectNum - 1);
const attached = combination.map((element) => [fixed, ...element]);
result.push(...attached);
});
return result;
};
그렇게 된다면, selectNum 길이만큼의 조합이 전체 나온다.
메뉴에 대한 조합을 구한다.
초기에 selectNum은, 1부터 order[i].length 까지 구하려했지만 비효율 => course에 담긴 숫자만큼 돌아준다.
course를 반복문으로 돌면서 course와 length 가 일치하는 요소를 찾아준다.
찾은 요소들에서 또 max 값을 구해서, max값과 일치하는 value 를 가진 요소만을 리턴해준다.
정렬시켜준다.
const getcombination = (arr, selectNum) => {
const result = [];
if (selectNum === 1) return arr.map((element) => [element]);
arr.forEach((fixed, index, origin) => {
const rest = origin.slice(index + 1);
const combination = getcombination(rest, selectNum - 1);
const attached = combination.map((element) => [fixed, ...element]);
result.push(...attached);
});
return result;
};
function solution(orders, course) {
const answer = [];
let obj = new Map();
for (let i = 0; i < orders.length; i++) {
const order = orders[i].split("");
for (let j = 0; j < course.length; j++) {
// // course에 담긴 length 만큼만 회전한다.
const combination = getcombination(order, course[j]);
combination
.map((element) => element.sort().join(""))
.forEach((element) => obj.set(element, (obj.get(element) || 0) + 1));
}
}
for (let i = 0; i < course.length; i++) {
const courseList = [];
let max = 0;
for (let [key, value] of obj) {
if (key.length === course[i] && value >= 2) {
courseList[key] = value;
max = Math.max(max, value);
}
}
for (let [key, value] of Object.entries(courseList)) {
if (value === max) answer.push(key);
}
}
return answer.sort();
}