프로그래밍 공방

[프로그래머스] 메뉴 리뉴얼 본문

개발/문제해결

[프로그래머스] 메뉴 리뉴얼

hyosupsong 2021. 2. 8. 21:58

문제

programmers.co.kr/learn/courses/30/lessons/72411

 

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

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

programmers.co.kr

문제해결방법

이 문제는 course 길이별로 order 문자들을 조합해서 각 길이별로 제일 많이 나온 조합을 찾는 문제였다.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package Programmers;
 
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.PriorityQueue;
 
class Menu {
    String name;
    int count;
    
    Menu(String name, int count) {
        this.name = name;
        this.count = count;
    }
}
 
public class Solution_메뉴리뉴얼 {
 
    public static boolean[] v = new boolean[20];
    public static Map<String, Integer> map = new HashMap<String, Integer>();
    
    public static void comb(String menu, int before, int count, int courseCount, String order) {
        if(count>=courseCount) {
            if(map.containsKey(menu)) map.put(menu, map.get(menu)+1);
            else map.put(menu, 1);
            return;
        }
        
        for(int i=before+1; i<order.length(); i++) {
            if(!v[i]) {
                v[i] = true;
                comb(menu+order.charAt(i), i, count+1, courseCount, order);
                v[i] = false;
            }
        }
    }
    
    public static String sortString(String s) {
        char[] ch = s.toCharArray();
        Arrays.sort(ch);
        StringBuilder sb = new StringBuilder();
        for(int i=0; i<ch.length; i++) sb.append(ch[i]);
        return sb.toString();
    }
    
    public static String[] solution(String[] orders, int[] course) {
        PriorityQueue<Menu> pq = new PriorityQueue<Menu>(new Comparator<Menu>() {
            @Override
            public int compare(Menu arg0, Menu arg1) {
                return Integer.compare(arg1.count, arg0.count);
            }
        });
        List<String> list = new ArrayList<String>();
        for(int i=0; i<orders.length; i++) orders[i] = sortString(orders[i]);
        for(int i=0; i<course.length; i++) {
            for(int j=0; j<orders.length; j++) {
                if(orders[j].length()<course[i]) continue;
                comb(""-10, course[i], orders[j]);
            }
            int max = Integer.MIN_VALUE;
            for(String key : map.keySet()) {
                int count = map.get(key);
                if(max<=count) {
                    max = count;
                    pq.add(new Menu(key, count));
                }
            }
            while(max!=1 && !pq.isEmpty()) {
                Menu menu = pq.poll();
                if(menu.count==max) list.add(menu.name);
                else break;
            }
            pq.clear();
            map.clear();
        }
        String[] answer = new String[list.size()];
        for(int i=0; i<list.size(); i++) answer[i] = list.get(i);
        Arrays.sort(answer);
        return answer;
    }
    
    public static void main(String[] args) {
        String[] orders = {"ABCFG""AC""CDE""ACDE""BCFG""ACDEH"};
        int[] course = {234};
        String[] answer = solution(orders, course);
        for(int i=0; i<answer.length; i++System.out.println(answer[i]);
    }
}
cs


코드에 대한 피드백이나 더 좋은 아이디어는 언제나 환영입니다.

'개발 > 문제해결' 카테고리의 다른 글

[프로그래머스] 실패율  (0) 2021.02.10
[프로그래머스] 다트 게임  (0) 2021.02.10
[백준] 5676번 : 음주 코딩  (0) 2021.02.05
[프로그래머스] 순위 검색  (0) 2021.02.04
[백준] 14425번 : 문자열 집합  (0) 2021.02.02