728x90
문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/72411
풀이 방법
이 문제는 주어진 메뉴들을 2가지 이상의 조합을 가지고 가장 많이 선택된 조합을 구하는 것이 중요한 문제라 생각했다.
하지만 문제 설명을 보면 같은 메뉴는 한 코스에 2번 이상 반복되면 안되고, 순서가 오름차순으로 해야 하기 때문에 메뉴 조합을 구할 땐 순열을 이용해 구해야한다.
메뉴의 갯수별로 코스 조합을 나눠서 구하고 그 조합의 길이가 구해야하는 길이와 같고, 주문된 횟수가 많은 것들을 구해 종합한다.
이후 종합한 답을 반환할 때 제한사항에 마춰 오름차순으로 정렬한 뒤 반환해준다.
코드
const solution = (orders, course) => {
let answer = [];
let comb = {};
course.forEach(num => {
comb[num] = {};
orders.forEach(menu => {
const combi = GetComb(menu.split(''), num).map(e => {
const sortedMenu = e.sort().join('');
comb[num][sortedMenu] ? comb[num][sortedMenu] += 1 : comb[num][sortedMenu] = 1;
});
})
let max = 2;
for(let key in comb[num]){
if(comb[num][key] === 1) continue;
comb[num][key] > max ? max = comb[num][key] : '';
}
Object.keys(comb[num]).filter(e => e.length === num && comb[num][e] === max).forEach(e => answer.push(e));
});
return answer.sort();
}
const GetComb = (arr, n) => {
const results = [];
if(n === 1) return arr.map(e => [e]);
arr.forEach((fix, idx, a) => {
const rest = a.slice(idx + 1);
const combArr = GetComb(rest, n - 1);
const combFix = combArr.map((el) => [fix, ...el]);
results.push(...combFix);
});
return results;
}
728x90
'코딩 테스트 > 프로그래머스 코딩 테스트 연습' 카테고리의 다른 글
[JS] 2Level / 2018 KAKAO BLIND RECRUITMENT / [3차] 방금그곡 (1) | 2023.10.13 |
---|---|
[JS] 2Level / 연습문제 / 무인도 여행 (0) | 2023.10.12 |
2Level / 2022 KAKAO TECH INTERNSHIP / 두 큐 합 같게 만들기 (1) | 2023.10.07 |
2Level / 월간 코드 챌린지 시즌1 / 쿼드압축 후 개수 세기 (0) | 2023.10.05 |
2Level / 연습 문제 / 연속된 부분 수열의 합 (0) | 2023.10.03 |