programmers_메뉴 리뉴얼_java

2023. 4. 17. 10:26Algorithm/Programmers

728x90

https://school.programmers.co.kr/learn/courses/30/lessons/72411

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

import java.util.*;
import java.util.Map.Entry;

class Solution {
    public String[] solution(String[] orders, int[] course) {
        String[] answer = {};
        
        List<String> answerList = new ArrayList<>();        
        Map<String, Integer> map = new HashMap<>();
        
        for(String order : orders){
            char[] arr = order.toCharArray();
            Arrays.sort(arr); // 문자열 정렬
            makeCourse(String.valueOf(arr), 0, course, map, "", false);
        }
        
        // Map 정렬 (길이가 짧은순서, value가 큰 순서)
        // Map.Entry 리스트 작성
		List<Entry<String, Integer>> list_entries = new ArrayList<Entry<String, Integer>>(map.entrySet());
		// 비교함수 Comparator를 사용하여 오름차순으로 정렬
		Collections.sort(list_entries, new Comparator<Entry<String, Integer>>() {
			// compare로 값을 비교
			public int compare(Entry<String, Integer> obj1, Entry<String, Integer> obj2) {
                int lengthSort = obj1.getKey().length() - obj2.getKey().length();
                if(lengthSort == 0){ // 길이가 같은 경우
                    return obj2.getValue() - obj1.getValue();
                }else{ // 길이가 다른 경우
                    return obj1.getKey().length() - obj2.getKey().length();
                }
			}
		});
        
        // 정렬 확인
        // for(Entry<String, Integer> tmp : list_entries){
        //     System.out.println(tmp.getKey() + " " + tmp.getValue());
        // }
        
        // answer 찾기
        int courseLeng = 0;
        int size = 0;
        for(Entry<String, Integer> entry : list_entries) {
            if(entry.getValue() == 1) continue;
            
            if(entry.getKey().length() > courseLeng){ // 길이가 긴 값 나올 경우
                size = entry.getValue();
                courseLeng = entry.getKey().length();
                answerList.add(entry.getKey());
            }else if(entry.getKey().length() == courseLeng && entry.getValue() == size){ // 같은 길이 같은 값일 경우
                answerList.add(entry.getKey());
            }
		}
        
        
        Collections.sort(answerList);        
        // System.out.println(answerList.toString());
        answer = new String[answerList.size()];
        int i = 0;
        for(String s : answerList){
            answer[i++] = s;
        }
        
        return answer;
    }
    
    // 코스 요리 추가
    public void makeCourse(String order, int cnt, int[] course, Map<String, Integer> map, String menu, boolean isbefore){
        
        int menuLength = menu.length();        
        if(!isbefore){
            for(int i : course){
                if(i == menuLength){
                    map.put(menu, map.getOrDefault(menu, 0) + 1);
                    break;
                }
            }   
        }
        
        if(cnt >= order.length()) return;
       
        makeCourse(order, cnt+1, course, map, menu+order.charAt(cnt), false); // 포함
        makeCourse(order, cnt+1, course, map, menu, true); // 포함 x
        
    }
}