코딩테스트/프로그래머스

[Java] 프로그래머스 - 메뉴 리뉴얼 (2단계)

배똥회장 2022. 4. 27. 16:24
728x90
코딩 테스트 풀이 체크리스트
2시간 내에 풀었는가? X
본인의 실력으로 풀었는가? O

 

 

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

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

programmers.co.kr

 

 

 

 

 

import java.util.*;
class Solution {
    HashMap<Integer, HashMap<String, Integer>> map;
    public String[] solution(String[] orders, int[] course) {
        ArrayList<String> answer = new ArrayList<>();
        map = new HashMap<>();
        
        for (int i = 0; i < orders.length; i++) {
            char[] word = orders[i].toCharArray();
            Arrays.sort(word);
            orders[i] = new String(word);
        }
        
        for (int i = 0; i < orders.length; i++) {
            String[] word = orders[i].split("");
            func(word, new StringBuilder(), 0);
        }
        
        for (int i = 0; i < course.length; i++) {
            HashMap<String, Integer> list = map.getOrDefault(course[i], new HashMap<>());
            
            int max = 2;
            ArrayList<String> temp = new ArrayList<>();
            for (String key : list.keySet()) {
                int length = list.get(key);
                if (max < length) {
                    max = length;
                    temp = new ArrayList<>();
                    temp.add(key);
                } else if (max == length) {
                    temp.add(key);
                }
            }
            
            answer.addAll(temp);
        }
        
        Collections.sort(answer);
        return answer.toArray(new String[answer.size()]);
    }
    
    public void func(String[] base, StringBuilder word, int p) {
        HashMap<String, Integer> arr = map.getOrDefault(word.length(), new HashMap<>());
        
        arr.put(word.toString(), arr.getOrDefault(word.toString(), 0) + 1);    
        map.put(word.length(), arr);
            
        if (base.length == word.length()) return;
        
        for (int i = p; i < base.length; i++) {
            StringBuilder sb = new StringBuilder(word);
            sb.append(base[i]);
            
            func(base, sb, i+1);
        }
    }
}

 

테스트 1 통과 (1.68ms, 69.6MB)
테스트 2 통과 (1.35ms, 75.3MB)
테스트 3 통과 (1.47ms, 71.4MB)
테스트 4 통과 (1.70ms, 79.4MB)
테스트 5 통과 (1.65ms, 69.5MB)
테스트 6 통과 (3.32ms, 73.5MB)
테스트 7 통과 (2.57ms, 81MB)
테스트 8 통과 (10.82ms, 92.1MB)
테스트 9 통과 (9.36ms, 79.9MB)
테스트 10 통과 (11.29ms, 92.3MB)
테스트 11 통과 (8.01ms, 86.6MB)
테스트 12 통과 (8.32ms, 79.4MB)
테스트 13 통과 (8.73ms, 80.8MB)
테스트 14 통과 (12.31ms, 81.5MB)
테스트 15 통과 (11.57ms, 85.4MB)
테스트 16 통과 (12.73ms, 89.9MB)
테스트 17 통과 (19.45ms, 93.4MB)
테스트 18 통과 (18.44ms, 82.1MB)
테스트 19 통과 (18.81ms, 91.7MB)
테스트 20 통과 (16.94ms, 89.8MB)

 

 

 

 

 

orders의 단어들 일단 오름차순 정렬한다.

정렬한 orders 단어들을 하나씩 꺼내면서 만들 수 있는 단어 리스트를 만들면서 몇 번 만들어지는지를 체크한다

그리고 나서 course를 하나씩 꺼내면서 해당 길이에 대해서 가장 많이 조합된 단어를 answer에 넣는다

마지막으로 answer을 오름차순 정렬한 후 리턴한다.

 

 

 

 

 

728x90