Loading...
본문 바로가기
👥
총 방문자
📖
0개 이상
총 포스팅
🧑
오늘 방문자 수
📅
0일째
블로그 운영

여러분의 방문을 환영해요! 🎉

다양한 개발 지식을 쉽고 재미있게 알려드리는 블로그가 될게요. 함께 성장해요! 😊

PS/프로그래머스

[프로그래머스][조합] 메뉴리뉴얼

by 꽁이꽁설꽁돌 2025. 10. 24.
728x90
반응형
     
목차

     

     

     

    문제

    https://school.programmers.co.kr/learn/courses/30/lessons/72411

     

    프로그래머스

    SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

    programmers.co.kr

     

     

    문제 구현 방향

    문자열에서 각 문자에 대해 2개 이상씩 나오면 구한 조합을 바탕으로 비교하는 식으로 진행했다.

    이때 쉽게 풀 수 있는 방법은 길이별로 배열을 만들어 스택형식으로 푸는 것이다.

     

    1. top이 메뉴 조합보다 작을 경우 -> 배열을 비운 뒤 새로 넣어준다.

    2. top이 메뉴 조합보다 클 경우 ->  아무것도 하지 않는다.

    3. top이 메뉴 조합이랑 같은 경우 -> 그냥 push 해준다.

     

     

     

    코드 구현

    function solution(orders, course) {
        var target = Array.from({length: 100}, ()=> []);
        function combi(comb, arr, n, idx) {
            if (comb.length === n) {
                let cnt = 0;
                for (let order of orders) {
                    if (comb.every((item) => order.includes(item))) cnt++;
                }
                if (cnt >= 2) {
                    if(target[n].length === 0){
                        target[n].push([...comb, cnt]);
                    }else{
                        let top = target[n][0][ target[n][0].length-1];
                        if(top === cnt){
                            target[n].push([...comb, cnt]);
                        }else if(top < cnt){
                            target[n]=[];
                            target[n].push([...comb, cnt]);
                        }else{
                            ;
                        }
                    }
                }
                return;
            }
            for (let i = idx + 1; i < arr.length; i++) {
                comb.push(arr[i]);
                combi(comb, arr, n, i);
                comb.pop();
            }
        }
        let dic = [
            "A",
            "B",
            "C",
            "D",
            "E",
            "F",
            "G",
            "H",
            "I",
            "J",
            "K",
            "L",
            "M",
            "N",
            "O",
            "P",
            "Q",
            "R",
            "S",
            "T",
            "U",
            "V",
            "W",
            "X",
            "Y",
            "Z",
        ];
        let arr = [];
        for (let dc of dic) {
            let cnt = 0;
            for (let order of orders) {
                if (order.includes(dc)) {
                    cnt++;
                }
            }
            if (cnt >= 2) arr.push(dc);
        }
        let comb = [];
        let answer= [];
        for (let crs of course) {
            combi(comb, arr, crs, -1);
        }
        for (let crs of course) {
            if(target[crs].length){
                for(let tg of target[crs]){
                    answer.push(tg.slice(0, tg.length-1).join(""));
                }
            }
        }
        answer.sort((a, b)=>a.localeCompare(b));
         return answer;
    }
    반응형