1. 문제링크
https://programmers.co.kr/learn/courses/30/lessons/72411
코딩테스트 연습 - 메뉴 리뉴얼
레스토랑을 운영하던 스카피는 코로나19로 인한 불경기를 극복하고자 메뉴를 새로 구성하려고 고민하고 있습니다. 기존에는 단품으로만 제공하던 메뉴를 조합해서 코스요리 형태로 재구성해서
programmers.co.kr
2. 접근방법
2명이상의 손님이 먹을 수 있는 메뉴!
메뉴 구성은 2개 코스로 나올 수 있는 모든 요리 수 즉! 조합이다!
그리고 그 조합을 가지고
"만약 가장 많이 함께 주문된 메뉴 구성이 여러 개라면, 모두 배열에 담아 return 하면 됩니다."
라는 말이 있기 때문에
조합에서 나올 수 있는 명수를 체크하고 같을 경우에는 추가로 담아주는 작업이 필요하다
문제는 우선 course 배열로 만들 수 있는 조합을 찾아야한다 !!!
이후 만들어진 음식 조합이 몇번 나왔는지 체크하고 체크된 수 중 최고값을 찾고 최고값이 2이상이라면 결과값에 더해주는 방식으로 접근하였다.
3. 코드
import java.util.*;
class Solution {
char maps[], sel[];
HashMap<Character, String>[] ordersmap;
int ans, cnt;
String ansstr;
List<String> list;
int calcul(char[] sel) {
int cnt = 0;
for (int i = 0; i < ordersmap.length; i++) {
boolean chk = true;
for (int j = 0; j < sel.length; j++) {
if (!ordersmap[i].containsKey(sel[j])) {
chk = false;
break;
}
}
if (chk) {
cnt++;
}
}
return cnt;
}
void nCr(int idx, int start, int N, int R) {
if (idx == R) {
cnt = calcul(sel);
if (ans < cnt) {
ans = cnt;
list = new ArrayList<String>();
ansstr = "";
for (int i = 0; i < sel.length; i++) {
ansstr += sel[i];
}
list.add(ansstr);
} else if (ans == cnt) {
ansstr = "";
for (int i = 0; i < sel.length; i++) {
ansstr += sel[i];
}
list.add(ansstr);
}
return;
}
for (int i = start; i < N; i++) {
sel[idx] = maps[i];
nCr(idx + 1, i + 1, N, R);
}
}
public String[] solution(String[] orders, int[] course) {
HashMap<Character, String> map = new HashMap<>();
ordersmap = new HashMap[orders.length];
for (int i = 0; i < orders.length; i++) {
ordersmap[i] = new HashMap<>();
for (int j = 0; j < orders[i].length(); j++) {
map.put(orders[i].charAt(j), "1");
ordersmap[i].put(orders[i].charAt(j), "1");
}
}
int N = map.size();
maps = new char[N];
int index = 0;
for (char key : map.keySet())
maps[index++] = key;
String temp[] = new String[100001];
index = 0;
for (int i = 0; i < course.length; i++) {
ans = 0;
cnt = 0;
ansstr = "";
int R = course[i];
sel = new char[R];
list = new ArrayList<String>();
nCr(0, 0, N, R);
if(ans > 1)
for (String s : list)
temp[index++] = s;
}
String[] answer = new String[index];
for (int i = 0; i < index; i++) {
answer[i] = temp[i];
}
Arrays.sort(answer);
return answer;
}
}
4. 마치며
역시 카카오... 만만하지 않았다 어려운 녀석이였다.
하지만 그 만큼 재미있었던 문제였다.
'알고리즘' 카테고리의 다른 글
백준 1018 : 체스판 다시 칠하기 (Java) (0) | 2021.06.02 |
---|---|
프로그래머스 : 문자열 내림차순으로 배치하기 (Java) (0) | 2021.05.30 |
프로그래머스 : 게임 맵 최단거리 (Java) (0) | 2021.05.22 |
프로그래머스 : 짝지어 제거하기 (Java) (0) | 2021.05.21 |
프로그래머스 : 서울에서 김서방 찾기 (Java) (0) | 2021.05.20 |