Skip to content

Commit cffca50

Browse files
committed
[level 2] Title: 메뉴 리뉴얼, Time: 10.25 ms, Memory: 93.1 MB -BaekjoonHub
1 parent e178ab1 commit cffca50

File tree

2 files changed

+221
-0
lines changed

2 files changed

+221
-0
lines changed
Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
# [level 2] 메뉴 리뉴얼 - 72411
2+
3+
[문제 링크](https://school.programmers.co.kr/learn/courses/30/lessons/72411)
4+
5+
### 성능 요약
6+
7+
메모리: 93.1 MB, 시간: 10.25 ms
8+
9+
### 구분
10+
11+
코딩테스트 연습 > 2021 KAKAO BLIND RECRUITMENT
12+
13+
### 채점결과
14+
15+
정확성: 100.0<br/>합계: 100.0 / 100.0
16+
17+
### 제출 일자
18+
19+
2025년 08월 26일 13:19:33
20+
21+
### 문제 설명
22+
23+
<p>레스토랑을 운영하던 <code>스카피</code>는 코로나19로 인한 불경기를 극복하고자 메뉴를 새로 구성하려고 고민하고 있습니다.<br>
24+
기존에는 단품으로만 제공하던 메뉴를 조합해서 코스요리 형태로 재구성해서 새로운 메뉴를 제공하기로 결정했습니다. 어떤 단품메뉴들을 조합해서 코스요리 메뉴로 구성하면 좋을 지 고민하던 "스카피"는 이전에 각 손님들이 주문할 때 가장 많이 함께 주문한 단품메뉴들을 코스요리 메뉴로 구성하기로 했습니다.<br>
25+
단, 코스요리 메뉴는 최소 2가지 이상의 단품메뉴로 구성하려고 합니다. 또한, 최소 2명 이상의 손님으로부터 주문된 단품메뉴 조합에 대해서만 코스요리 메뉴 후보에 포함하기로 했습니다.</p>
26+
27+
<p>예를 들어, 손님 6명이 주문한 단품메뉴들의 조합이 다음과 같다면,<br>
28+
(각 손님은 단품메뉴를 2개 이상 주문해야 하며, 각 단품메뉴는 A ~ Z의 알파벳 대문자로 표기합니다.)</p>
29+
<table class="table">
30+
<thead><tr>
31+
<th>손님 번호</th>
32+
<th>주문한 단품메뉴 조합</th>
33+
</tr>
34+
</thead>
35+
<tbody><tr>
36+
<td>1번 손님</td>
37+
<td>A, B, C, F, G</td>
38+
</tr>
39+
<tr>
40+
<td>2번 손님</td>
41+
<td>A, C</td>
42+
</tr>
43+
<tr>
44+
<td>3번 손님</td>
45+
<td>C, D, E</td>
46+
</tr>
47+
<tr>
48+
<td>4번 손님</td>
49+
<td>A, C, D, E</td>
50+
</tr>
51+
<tr>
52+
<td>5번 손님</td>
53+
<td>B, C, F, G</td>
54+
</tr>
55+
<tr>
56+
<td>6번 손님</td>
57+
<td>A, C, D, E, H</td>
58+
</tr>
59+
</tbody>
60+
</table>
61+
<p>가장 많이 함께 주문된 단품메뉴 조합에 따라 "스카피"가 만들게 될 코스요리 메뉴 구성 후보는 다음과 같습니다.</p>
62+
<table class="table">
63+
<thead><tr>
64+
<th>코스 종류</th>
65+
<th>메뉴 구성</th>
66+
<th>설명</th>
67+
</tr>
68+
</thead>
69+
<tbody><tr>
70+
<td>요리 2개 코스</td>
71+
<td>A, C</td>
72+
<td>1번, 2번, 4번, 6번 손님으로부터 총 4번 주문됐습니다.</td>
73+
</tr>
74+
<tr>
75+
<td>요리 3개 코스</td>
76+
<td>C, D, E</td>
77+
<td>3번, 4번, 6번 손님으로부터 총 3번 주문됐습니다.</td>
78+
</tr>
79+
<tr>
80+
<td>요리 4개 코스</td>
81+
<td>B, C, F, G</td>
82+
<td>1번, 5번 손님으로부터 총 2번 주문됐습니다.</td>
83+
</tr>
84+
<tr>
85+
<td>요리 4개 코스</td>
86+
<td>A, C, D, E</td>
87+
<td>4번, 6번 손님으로부터 총 2번 주문됐습니다.</td>
88+
</tr>
89+
</tbody>
90+
</table>
91+
<hr>
92+
93+
<h4><strong>[문제]</strong></h4>
94+
95+
<p>각 손님들이 주문한 단품메뉴들이 문자열 형식으로 담긴 배열 orders, "스카피"가 <code>추가하고 싶어하는</code> 코스요리를 구성하는 단품메뉴들의 갯수가 담긴 배열 course가 매개변수로 주어질 때, "스카피"가 새로 추가하게 될 코스요리의 메뉴 구성을 문자열 형태로 배열에 담아 return 하도록 solution 함수를 완성해 주세요.</p>
96+
97+
<h4><strong>[제한사항]</strong></h4>
98+
99+
<ul>
100+
<li>orders 배열의 크기는 2 이상 20 이하입니다.</li>
101+
<li>orders 배열의 각 원소는 크기가 2 이상 10 이하인 문자열입니다.
102+
103+
<ul>
104+
<li>각 문자열은 알파벳 대문자로만 이루어져 있습니다.</li>
105+
<li>각 문자열에는 같은 알파벳이 중복해서 들어있지 않습니다.</li>
106+
</ul></li>
107+
<li>course 배열의 크기는 1 이상 10 이하입니다.
108+
109+
<ul>
110+
<li>course 배열의 각 원소는 2 이상 10 이하인 자연수가 <code>오름차순</code>으로 정렬되어 있습니다.</li>
111+
<li>course 배열에는 같은 값이 중복해서 들어있지 않습니다.</li>
112+
</ul></li>
113+
<li>정답은 각 코스요리 메뉴의 구성을 문자열 형식으로 배열에 담아 사전 순으로 <code>오름차순</code> 정렬해서 return 해주세요.
114+
115+
<ul>
116+
<li>배열의 각 원소에 저장된 문자열 또한 알파벳 <code>오름차순</code>으로 정렬되어야 합니다.</li>
117+
<li>만약 가장 많이 함께 주문된 메뉴 구성이 여러 개라면, 모두 배열에 담아 return 하면 됩니다.</li>
118+
<li>orders와 course 매개변수는 return 하는 배열의 길이가 1 이상이 되도록 주어집니다.</li>
119+
</ul></li>
120+
</ul>
121+
122+
<hr>
123+
124+
<h5><strong>[입출력 예]</strong></h5>
125+
<table class="table">
126+
<thead><tr>
127+
<th>orders</th>
128+
<th>course</th>
129+
<th>result</th>
130+
</tr>
131+
</thead>
132+
<tbody><tr>
133+
<td><code>["ABCFG", "AC", "CDE", "ACDE", "BCFG", "ACDEH"]</code></td>
134+
<td>[2,3,4]</td>
135+
<td><code>["AC", "ACDE", "BCFG", "CDE"]</code></td>
136+
</tr>
137+
<tr>
138+
<td><code>["ABCDE", "AB", "CD", "ADE", "XYZ", "XYZ", "ACD"]</code></td>
139+
<td>[2,3,5]</td>
140+
<td><code>["ACD", "AD", "ADE", "CD", "XYZ"]</code></td>
141+
</tr>
142+
<tr>
143+
<td><code>["XYZ", "XWY", "WXA"]</code></td>
144+
<td>[2,3,4]</td>
145+
<td><code>["WX", "XY"]</code></td>
146+
</tr>
147+
</tbody>
148+
</table>
149+
<h5><strong>입출력 예에 대한 설명</strong></h5>
150+
151+
<hr>
152+
153+
<p><strong>입출력 예 #1</strong><br>
154+
문제의 예시와 같습니다.</p>
155+
156+
<p><strong>입출력 예 #2</strong><br>
157+
AD가 세 번, CD가 세 번, ACD가 두 번, ADE가 두 번, XYZ 가 두 번 주문됐습니다.<br>
158+
요리 5개를 주문한 손님이 1명 있지만, 최소 2명 이상의 손님에게서 주문된 구성만 코스요리 후보에 들어가므로, 요리 5개로 구성된 코스요리는 새로 추가하지 않습니다.</p>
159+
160+
<p><strong>입출력 예 #3</strong><br>
161+
WX가 두 번, XY가 두 번 주문됐습니다.<br>
162+
3명의 손님 모두 단품메뉴를 3개씩 주문했지만, 최소 2명 이상의 손님에게서 주문된 구성만 코스요리 후보에 들어가므로, 요리 3개로 구성된 코스요리는 새로 추가하지 않습니다.<br>
163+
또, 단품메뉴를 4개 이상 주문한 손님은 없으므로, 요리 4개로 구성된 코스요리 또한 새로 추가하지 않습니다.</p>
164+
165+
166+
> 출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import java.util.*;
2+
class Solution {
3+
4+
Map<String,Integer> map = new HashMap<>();
5+
ArrayList<String> answerList = new ArrayList<>();
6+
public String[] solution(String[] orders, int[] course) {
7+
for(int length:course){
8+
9+
// Course에 해당하는 조합
10+
for(String order:orders){
11+
char[] ch = order.toCharArray();
12+
13+
// 사전순 정렬
14+
Arrays.sort(ch);
15+
16+
// 조합을 찾아서 몇번 주문됐는지 기록
17+
findCombo(ch,0,length,new StringBuilder());
18+
}
19+
if(!map.isEmpty()){
20+
int maxValue = map.values().stream()
21+
.mapToInt(Integer::intValue)
22+
.max()
23+
.orElse(0);
24+
25+
if(maxValue >= 2){
26+
for(String key:map.keySet()){
27+
// 최댓값
28+
if(map.get(key) == maxValue){
29+
answerList.add(key);
30+
}
31+
}
32+
}
33+
}
34+
// map을 비움
35+
map.clear();
36+
}
37+
Collections.sort(answerList);
38+
return answerList.toArray(String[]::new);
39+
}
40+
41+
void findCombo(char[] order, int startIdx, int length, StringBuilder current){
42+
43+
if(current.length() == length){
44+
String combo = current.toString();
45+
map.put(combo,map.getOrDefault(combo,0) +1);
46+
return;
47+
}
48+
49+
for(int i = startIdx; i<order.length;i++){
50+
current.append(order[i]);
51+
findCombo(order,i+1,length,current);
52+
current.deleteCharAt(current.length()-1);
53+
}
54+
}
55+
}

0 commit comments

Comments
 (0)