말랑한 하루

[Programmers] 메뉴 리뉴얼 (Lv 2, JavaScript) 본문

문제풀이/Programmers

[Programmers] 메뉴 리뉴얼 (Lv 2, JavaScript)

지수는말랑이 2022. 7. 11. 19:21
반응형

[ 개요 ]
풀이시간 : 115분

[ 학습 내용 ]
- includes() : 문자열 포함확인. java의 contains를 자꾸 쓰려고한다. 고쳐나갈 것

- Object.keys(object) : key-value로 구성된 Object의 key를 배열로 반환한다.

- Object.values(object) : key-value로 구성된 Object의 value를 배열로 반환한다.

- Object.entries(object) : object의 key, value쌍 배열을 반환한다. 다음 예제로 활용할 수 있다.

- reduce(arr, cur) : 누산기 acc를 지니고 현재값 cur을 순회하여 acc를 반환하는 함수. 활용도가 무궁무진하니 익숙해지기


[ 소스 코드 ]

function solution(orders, course) {
    var answer = [];
    var menus = [], menu = [], order = [], check = [], len = 0;
    
    const getUnion = (idx, cnt) => {
        if (cnt === len) {
            let cook = menu.join("");
            menus[cook] = menus[cook] === undefined ? 1 : menus[cook] + 1;
            return;
        }
        for(var i=idx; i<order.length; i++) {
            if (!check[i]) {
                check[i] = true;
                menu[cnt] = order[i];
                getUnion(i+1, cnt+1);
                check[i] = false;
            }
        }
    }

    orders.forEach((orders) => {
        order = orders.split("").sort().join("");
        course.forEach((course) => {
            len = course;
            menu = [];
            check = new Array(order.length).fill(false);
            if (order.length >= course) getUnion(0, 0);
        })
    })
    
    var candi = [];
    course.forEach((course) => {
        candi[course] = [];
        let cooks = Object.keys(menus).filter(menu => menu.length == course);
        let max_order = 2;
        cooks.forEach((cook) => {
            if (max_order < menus[cook]) {
                max_order = menus[cook];
                candi[course] = [cook];
            } else if (max_order === menus[cook]) {
                candi[course].push(cook);
            }
        })
    })
    answer = candi.reduce((acc, cur) => [...acc, ...cur]);    

    return answer.sort();
}

[ 심화 코드 ]

const selected = Object.entries(obj)
    .filter(([key, value]) => {
        if (value === max) return true;
    })
    .reduce((obj, key) => {
    	return [...obj, key];
    })
    .map(([key, _]) => {
        return key;
    });

[ 코드 분석 ]

Object와 Array간 이해가 충돌하여, filter가 기본적으로 Array에 적용되어 Object에 직접 filter를 사용하는 행위를 할 수 없었음. Object.entries()를 통해 Object를 key-value값으로 반환받았을 때, 비로소 filter-reduce-map 등을 적용할 수 있었다.

빈 배열에 ["code"]와 같이 문자열로 key-value쌍을 만들어 대입할 시 해당 배열은 Object로 변환하여 entires()와 key-value를 활용하여 문제를 풀어나가야 함을 알았음.

반응형
Comments