난이도: Lv. 2
정답률: 49%
문제: https://school.programmers.co.kr/learn/courses/30/lessons/72411
알고리즘
해당 단품 메뉴들의 개수가 될 수 있는 모든 경우의 수가 몇 개 나올 수 있는지 위와 같은 형태로 객체에 담는다. 첫 번째 키는 단품 메뉴들의 개수, 두 번째 키는 가능한 메뉴 조합이다.
- 파라미터로 주어진 각 사람의 주문 내역을 오름차순으로 정렬해서 DFS에 돌리며 객체를 채운다.. 'AB'와 'BA'는 같기 코스이기 때문에 정렬을 한다..
- 1로 만들어진 객체를 순회하며 각 메뉴들의 개수 중 최댓값을 answer 배열에 담는다. 'AB'가 3, 'AC'가 4면 'AC'만 정답 배열에 담아야 한다.
- answer 배열을 정렬해서 리턴한다.
코드
function solution(orders, course) {
var answer = [];
const menuObj = {};
const ordersStrArr = [];
for (let order of orders) {
ordersStrArr.push(Array.from(order).sort());
}
const dfs = (order, currOrder, courseNum, startIdx) => {
if (currOrder.length === courseNum) {
if (menuObj[courseNum][currOrder]) { menuObj[courseNum][currOrder]++; }
else { menuObj[courseNum][currOrder] = 1; }
return;
}
for (let i = startIdx + 1; i < order.length; i++) {
dfs(order, currOrder + order[i], courseNum, i);
}
}
for (let courseNum of course) {
menuObj[courseNum] = {};
for (let order of ordersStrArr) {
if (order.length < courseNum) { continue; }
for (let i = 0; i < order.length; i++) {
dfs(order, order[i], courseNum, i);
}
}
}
for (let courseNumObj of Object.values(menuObj)) {
let max = 0;
let maxKey = [];
for (let [key, value] of Object.entries(courseNumObj)) {
if (value < 2) { continue; }
if (value > max) {
max = value;
maxKey = [key];
} else if (value === max) {
maxKey.push(key);
}
}
answer.push(...maxKey);
}
return answer.sort();
}
주저리
고난까지는 아니고 아무튼 뭐 그런 것1
dfs에서 주문 목록 길이 - 시작 인덱스 < 코스 요리 개수 이면 dfs 끝내도록 했는데 그러니까 순회를 제대로 하지 않았다. 뭔가 1 차이로 그러는 것 같긴 한데 이 부분은 없애고 하니까 제대로 순회하길래 그냥 없애고 진행했다.
고난까지는 아니고 아무튼 뭐 그런 것2
처음 만든 객체는 이렇게 생겼었다. 최댓값 골라낼 생각 하니까 갑자기 정신이 아득해져서 코스 요리 개수 안에 코스 요리를 담도록 객체를 수정했다.
'코딩테스트' 카테고리의 다른 글
[JS] 시소 짝꿍 (0) | 2024.05.07 |
---|---|
[JS] 마법의 엘리베이터 (0) | 2024.04.30 |
[JS] 전력망을 둘로 나누기 (0) | 2024.04.09 |
[JS] 124 나라의 숫자 (0) | 2024.04.05 |
[JS] 유전법칙 (0) | 2024.04.04 |