메뉴 리뉴얼
2025-04-11
#JAVA#프로그래머스
문제 풀이 시간 : 1시간
문제 풀이 :
이 문제는 처음 보고 dp로 풀어야 하나? 라고 고민했었는데 아무리 생각해도 풀이법이 떠오르지 않았다.
그래서 조합을 생각했는데 조합으로 해도 경우의 수가 엄청나게 많아지지는 않는 것 같아서
조합으로 풀게 되었다.
먼저, 아래 코드는 특정 주문에 대한 메뉴들의 조합을 만드는 함수이다.
public void find(char[] order, int idx, int len, StringBuilder sb) {
if (sb.length() == len) {
map.put(sb.toString(), map.getOrDefault(sb.toString(), 0) + 1);
return;
}
for (int i = idx; i < order.length; i++) {
sb.append(order[i]);
find(order, i + 1, len, sb);
sb.deleteCharAt(sb.length() - 1);
}
}
여기서 order는 주문, idx는 현재 주문에서의 메뉴 인덱스, len은 만들어야 하는 조합의 길이, sb는 만들어진 조합이다.
아래 코드에서 만들어야하는 코스의 길이에 대해 해시맵을 생성하고,
각 주문에 대해 조합을 생성한다.
그 후, 해당 코스 길이에서 최대로 많이 주문된 횟수를 구한다.
그 후, 주문의 수가 2가 넘고 최댓값과 같은 조합을 배열에 추가하면 된다.
for (int i = 0; i < course.length; i++) {
map = new HashMap<>();
for (int j = 0; j < orders.length; j++) {
char[] order = orders[j].toCharArray();
Arrays.sort(order);
find(order, 0, course[i], new StringBuilder()); //조합 생성
}
int max = 0;
for (int val : map.values()) {
max = Math.max(max, val);
}
if (max >= 2) { //주문의 수가 2를 넘어야 함
for (Map.Entry<String, Integer> entry : map.entrySet()) {
if (entry.getValue() == max) { //최댓값과 같은 조합
arr.add(entry.getKey());
}
}
}
}
최종 코드
import java.util.*;
class Solution {
public Map<String,Integer> map;
public void find(char[] order, int idx, int len, StringBuilder sb){
if(sb.length() == len){
map.put(sb.toString(), map.getOrDefault(sb.toString(),0)+1);
return;
}
for(int i=idx;i<order.length;i++){
sb.append(order[i]);
find(order, i+1, len, sb);
sb.deleteCharAt(sb.length() - 1);
}
}
public String[] solution(String[] orders, int[] course) {
String[] answer = {};
ArrayList<String> arr = new ArrayList<>();
for(int i=0;i<course.length;i++){
map = new HashMap<>();
for(int j=0;j<orders.length;j++){
char[] order = orders[j].toCharArray();
Arrays.sort(order);
find(order, 0, course[i], new StringBuilder());
}
int max = 0;
for(int val : map.values()){
max = Math.max(max, val);
}
if (max >= 2) {
for (Map.Entry<String, Integer> entry : map.entrySet()) {
if (entry.getValue() == max) {
arr.add(entry.getKey());
}
}
}
}
answer = arr.toArray(new String[0]);
Arrays.sort(answer);
return answer;
}
}