728x90

프로그래머스 2021 KAKAO BLIND RECRUITMENT 2번 문제 메뉴 리뉴얼

처음 문제를 풀때 반대의 방향으로 접근을 하여 시간이 더욱 소요 되었다. 

 

먼저 이 문제는 부르트포스 알고리즘을 통해 해결한다.

 

주문한 모든 메뉴들의 조합을 각각 구한 뒤, 기록을 해두고 가장 많은 조합을 찾으면 된다.

생각보다 단순한 논리였다.

 

import java.util.*;

class Solution {
      HashMap<String, Integer> hashMap = new HashMap<>();

    public String[] solution(String[] orders, int[] course) {

        ArrayList<String> before = new ArrayList<>(); // 초기화
        StringBuilder sb = new StringBuilder();

        for (String menu : orders) {
            char[] tmp = menu.toCharArray();
            Arrays.sort(tmp);
            for (int i : course) {
                Comb(tmp, sb, 0, 0, i);
            }
         } // 각각의 조합을 만들어 둠.

        for (int i : course) {
            Set<Map.Entry<String, Integer>> entry2 = hashMap.entrySet();

            int max = 0;
            for (Map.Entry<String, Integer> entry : entry2) {
                if (entry.getKey().length() == i) {
                    max = Math.max(max, entry.getValue());
                }
            }
            for (Map.Entry<String, Integer> entry : entry2) {
                if (max > 1 && entry.getValue() == max && entry.getKey().length() == i)
                    before.add(entry.getKey());
            }
        }

        Collections.sort(before);
        String[] answer = new String[before.size()];

        for (int i = 0; i < before.size(); i++) {
            answer[i] = before.get(i);
        }

        return answer;
    }

    public void Comb(char[] order, StringBuilder sb, int start, int n, int r) {
        if (n == r) {
            hashMap.put(sb.toString(), hashMap.getOrDefault(sb.toString(), 0) + 1);
            return;
        }
        for (int i = start; i < order.length; i++) {
            sb.append(order[i]);
            Comb(order, sb, i + 1, n + 1, r);
            sb.delete(n, n + 1);
        }
    }
}
728x90

'알고리즘 > 프로그래머스' 카테고리의 다른 글

프로그래머스 신규 아이디 추천 - Java  (0) 2021.02.01
728x90

프로그래머스 2021 KAKAO BLIND RECRUITMENT 1번 문제 신규 아이디 추천

 

이 문제는 여러 방법이 있으나, 직접 구현하는 방법을 사용했다.

 

여기서 문자열의 정규식을 활용하여 풀면 더 짧게 시간이 소요된다.

class Solution{
    static StringBuilder answer;
    public static String solution(String new_id){
        answer = new StringBuilder();
        answer.append(new_id.toLowerCase());
        version2();
        v3();v4();v5();v6();v7();
        return answer.toString();
    }
    public static void version2(){
        for (int i = 0; i < answer.length(); i++) {
            char tmp = answer.charAt(i);
            if((tmp <'0' || tmp >'9') && (tmp <'a'|| tmp >'z')){
                if (tmp != '-' && tmp !='_' && tmp !='.'){
                    answer.deleteCharAt(i--);
                }
            }
        }
    }
    public static void v3(){
        while(answer.indexOf("..")!=-1){
            int start = answer.indexOf("..");
                answer.replace(start,start+2,".");
        }
    }
    public static void v4(){
        if(answer.charAt(0) == '.')
            answer.deleteCharAt(0);
        if(answer.length()>0 && answer.charAt(answer.length()-1)== '.')
            answer.deleteCharAt(answer.length()-1);
    }
    public static void v5(){
        if(answer.length() == 0)
            answer.append("a");
    }
    public static void v6(){
        if (answer.length() >= 16)
            answer.delete(15,answer.length());
        v4();
    }
    public static void v7(){
        while(answer.length() < 3){
            answer.append(answer.charAt(answer.length()-1));
        }
    }
}
728x90

'알고리즘 > 프로그래머스' 카테고리의 다른 글

프로그래머스 메뉴 리뉴얼 - Java  (0) 2021.02.01

+ Recent posts