본문 바로가기
정리/알고리즘

프로그래머스 - 메뉴 리뉴얼

by Hudini30 2022. 4. 8.

프로그래머스 - 메뉴 리뉴얼

해당 문제는 입력받은 orders로 만들수 있는 모든 메뉴의 갯수 및 중복된 조합이 들어오면 count를늘리는 식으로 course의 종류와 주문 횟수를 저장 한 후 이후 course를 구성할 때 가장인기있는 메뉴만 선택 하여 answer 메뉴를만들어 주는식으로 문제를 구현했습니다.
처음에는 가장 인기있는 메뉴 라는 조건을 놓쳐 모든 경우의 수중 2번 이상 주문된 적 있는 메뉴들을 리턴해 주려고 해서 문제가 있었습니다.

private Map<String, Integer> courseMap;
    public String[] solution(String[] orders, int[] course) {
        courseMap = new HashMap<>();
        List<String> answer = new ArrayList<>();


        for (String order : orders) {
            char[] orderChar = order.toCharArray();
            Arrays.sort(orderChar);
            String sortedOrder = new String(orderChar);
            dfs("", sortedOrder);
        }

        for (int courseSize : course) {
            AtomicInteger maxOrderCount = new AtomicInteger(2);
            List<String> courseList = new ArrayList<>();
            courseMap.forEach((courseName, orderCount) -> {
                if (orderCount >= maxOrderCount.get() && courseName.length() == courseSize) {
                    if (orderCount > maxOrderCount.get()) {
                        courseList.clear();
                        maxOrderCount.set(orderCount);
                    }
                    courseList.add(courseName);
                }
            });
            answer.addAll(courseList);
        }
        answer.sort(String::compareTo);

        return answer.toArray(new String[0]);
    }

    private void dfs(String preString, String remainString) {
        for (int i = 0; i < remainString.length(); i++) {
            String course = preString + remainString.charAt(i);
            if (course.length() > 1) {
                courseMap.put(course, courseMap.getOrDefault(course, 0) + 1);
            }
            dfs(course, remainString.substring(Math.min(i + 1, remainString.length())));
        }
    }

댓글