It's easy, if you try

[프로그래머스] 메뉴 리뉴얼 (Java) / 조합 / 문자열 / HashMap 본문

알고리즘/자바(Java)

[프로그래머스] 메뉴 리뉴얼 (Java) / 조합 / 문자열 / HashMap

s5he2 2021. 7. 6. 22:08
반응형

문제

https://programmers.co.kr/learn/courses/30/lessons/72411?language=java 

 

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

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

programmers.co.kr

풀이

import java.util.*;

class Solution {
    static HashMap<String, Integer> hm;
    public String[] solution(String[] orders, int[] course) {
        hm = new HashMap<>();
        
        for(String o: orders) {
            char[] order = o.toCharArray();
            Arrays.sort(order);
            for(int i=0; i< course.length; i++) {
                combination(0, 0, course[i], order, "");
            }
        }
        
        int[] maxCntOfCourse = new int[course[course.length -1] +1]; // course가 2,3,4인 경우 0~4까지
        for(String key: hm.keySet()) {
            // 최소 2명 이상의 손님으로부터
            if(hm.get(key) >= 2) {
                maxCntOfCourse[key.length()] = Math.max(hm.get(key), maxCntOfCourse[key.length()]);
            }
        }
        
        // maxCntOfCourse에 각 코스별 가장 많이 주문된 횟수가 채워진 상태
        List<String> answerTemp = new ArrayList<>();
        for(String key: hm.keySet()) {
            for(int i=0; i< maxCntOfCourse.length; i++) {
                if(maxCntOfCourse[i] == 0) continue;
                if(key.length() == i && hm.get(key) == maxCntOfCourse[i]) {
                    answerTemp.add(key);
                }
            }
        }
        
        Collections.sort(answerTemp);
        String[] answer = new String[answerTemp.size()];
        int i=0;
        for(String str: answerTemp) {
            answer[i++] = str;
        }
        
        return answer;
    }
    
    private static void combination(int cnt, int start, int limit, char[] order, String result) {
        if(cnt == limit) {
            hm.put(result, hm.getOrDefault(result, 0)+1);
            return;
        }
        
        for(int i=start; i< order.length;i++) {
            combination(cnt+1, i+1, limit, order, result+order[i]);
        }
    }
}
반응형
Comments