티스토리 뷰

 

 

코딩테스트 연습 - 메뉴 리뉴얼

레스토랑을 운영하던 스카피는 코로나19로 인한 불경기를 극복하고자 메뉴를 새로 구성하려고 고민하고 있습니다. 기존에는 단품으로만 제공하던 메뉴를 조합해서 코스요리 형태로 재구성해서

programmers.co.kr

해당 문제의 제한 크기가 크지 않은 걸 알 수 있다.

이러면 생각해볼 수 있는게 재귀가 있다.

dfs를 통해 course 길이 별 order의 경우의 수를 모두 구해줬다.

dfs가 종료된 후, order의 경우의 수 중에서 course 길이 별 최대로 주문된 코스요리(정답)를 구해줬다.

import java.util.*;

class Solution {
    Set<String> set = new HashSet<>();
    Map<String, Integer> setMenu = new HashMap<>();
    int max = 2;

    public String[] solution(String[] orders, int[] course) {
        String[] answer = {};
        List<String> list = new ArrayList<>();
        for (int c = 0; c < course.length; c++) {
            int courseLength = course[c];
            for (int i = 0; i < orders.length; i++) {
                String order = orders[i];
                if (order.length() < courseLength) continue;
                char[] charArray = order.toCharArray();
                Arrays.sort(charArray);
                order = String.valueOf(charArray);
                for (int orderIndex = 0; orderIndex < order.length(); orderIndex++) {
                    char[] menuList = new char[courseLength];
                    menuList[0] = order.charAt(orderIndex);
                    BackTracking(menuList, order, 1, orderIndex + 1);
                }
            } // courseLength 별 setMenu 조사 완료

            for (Map.Entry<String, Integer> entry : setMenu.entrySet()) {
                if (max == entry.getValue()) {
                    list.add(entry.getKey());
                    System.out.println(entry.getKey());
                }
            }
            max = 2;
            set = new HashSet<>();
            setMenu = new HashMap<>();
        }

        Collections.sort(list);
        answer = new String[list.size()];
        int i = 0;
        for (String s : list) {
            answer[i++] = s;
        }
        return answer;
    }

    private void BackTracking(char[] menuList, String order, int index, int startIndex) {
        if (index == menuList.length) {
            // 이미 있으면 set.add가 False 리턴함
            String newMenu = String.valueOf(menuList);
            if (newMenu.length() == menuList.length) {
                setMenu.put(newMenu, setMenu.getOrDefault(newMenu, 0) + 1);
                if (max < setMenu.get(newMenu)) {
                    max = setMenu.get(newMenu);
                }
            }
            return;
        }
        for (int i = startIndex; i < order.length(); i++) {
            menuList[index] = order.charAt(i);
            BackTracking(menuList, order, index + 1, i + 1);
        }

    }
}

public class code {
    public static void main(String[] args) {
        Solution s = new Solution();
        String[] orders = {"XYZ", "XWY", "WXA"};
        int[] course = {2, 3, 4};
        String[] answer = s.solution(orders, course);
        for (String str : answer) {
            System.out.println(str);
        }
    }
}
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함