in.add()

[72411] 메뉴 리뉴얼 본문

Algorithm/Programmers

[72411] 메뉴 리뉴얼

idan 2021. 9. 6. 21:10

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/72411

 

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

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

programmers.co.kr

 

문제 해결 방법

조합을 이용했다.

HashMap에 <조합, 조합이 나온 수> 를 저장해뒀고, 조합이 나온 수가 max 값 이라면 정답 배열에 추가했다.

 

import java.util.*;

class Solution {

    static HashMap<String, Integer>[] setByCourse; // course 갯수 별로 set 저장할 hashmap 배열
    static int N; // 현재 course 갯수
    static String order; // 현재 보고있는 order
    static int[] max; // course 갯수 별로 최댓값 저장할 배열

    public String[] solution(String[] orders, int[] course) {
        setByCourse = new HashMap[course.length];
        max = new int[course.length];
        PriorityQueue<String> setList = new PriorityQueue<>(); // 조건 "정답은 각 코스요리 메뉴의 구성을 문자열 형식으로 배열에 담아 사전 순으로 오름차순 정렬해서 return 해주세요." 를 위해 PQ
      
        for(int i = 0; i < orders.length; i++) { // 조건 "배열의 각 원소에 저장된 문자열 또한 알파벳 오름차순으로 정렬되어야 합니다." 를 위한 정렬
            String[] o = orders[i].split("");
            Arrays.sort(o);
            orders[i] = String.join("", o);
        }
      
        for(int i = 0; i < course.length; i++) {
            setByCourse[i] = new HashMap<>();
            N = course[i];
            for(int j = 0; j < orders.length; j++) {
                order = orders[j];
                getCourseSet(0, 0, "", i);
            }

            int m = max[i];
            if(m == 1) continue; // 조건 "최소 2명 이상의 손님으로부터 주문된 단품메뉴 조합에 대해서만 코스요리 메뉴 후보에 포함하기로 했습니다."

            setByCourse[i].forEach((key, value) -> { // hashmap의 key, value 보면서
                if(value == m) { // 최댓값이면 offet
                    setList.offer(key);
                }
            });
        }

        String[] answer = new String[setList.size()];
        int idx = 0;
        while(!setList.isEmpty()) {
            answer[idx++] = setList.poll();
        }
        return answer;
    }

    public void getCourseSet(int start, int cnt, String set, int courseIdx) { // 조합
        if(cnt == N) {
            setByCourse[courseIdx].put(set, setByCourse[courseIdx].getOrDefault(set, 0) + 1);
            max[courseIdx] = Math.max(max[courseIdx], setByCourse[courseIdx].get(set));
            return;
        }
        for(int i = start; i < order.length(); i++) {
            getCourseSet(i + 1, cnt + 1, set + order.charAt(i), courseIdx);
        }
    }
}

'Algorithm > Programmers' 카테고리의 다른 글

[42883] 큰 수 만들기  (0) 2021.09.14
[42746] 가장 큰 수  (0) 2021.09.13
[42885] 구명보트  (0) 2021.09.08
[72412] 순위 검색  (0) 2021.09.07
[81302] 거리두기 확인하기  (0) 2021.08.31
Comments