728x90
https://programmers.co.kr/learn/courses/30/lessons/72411
코딩테스트 연습 - 메뉴 리뉴얼
레스토랑을 운영하던 스카피는 코로나19로 인한 불경기를 극복하고자 메뉴를 새로 구성하려고 고민하고 있습니다. 기존에는 단품으로만 제공하던 메뉴를 조합해서 코스요리 형태로 재구성해서
programmers.co.kr
// 코드
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
|
import java.util.*;
class Solution {
List<Map<String, Integer>> FoodMaps = new ArrayList<>();
int[] MaxCnt = new int[11];
void comb(char[] str, int pos, StringBuilder candi) {
if(pos >= str.length) {
// 메뉴의 개수
int len = candi.length();
// 메뉴의 개수가 2개 이상일 때만 의미가 있다.
if(len >= 2) {
int cnt = FoodMaps.get(len).getOrDefault(candi.toString(), 0) + 1;
FoodMaps.get(len).put(candi.toString(), cnt);
MaxCnt[len] = Math.max(MaxCnt[len], cnt);
}
return;
}
// 선택하고
comb(str, pos+1, candi.append(str[pos]));
// 선택 안하고
candi.setLength(candi.length() - 1);
comb(str, pos+1, candi);
}
public String[] solution(String[] orders, int[] course) {
for(int i=0; i<=10; i++) FoodMaps.add(new HashMap<String, Integer>());
// 모든 조합을 만든다.
for(String str : orders) {
char[] arr = str.toCharArray();
Arrays.sort(arr);
comb(arr, 0, new StringBuilder());
}
List<String> list = new ArrayList<>();
for(int len : course) {
for(Map.Entry<String, Integer> entry : FoodMaps.get(len).entrySet()) {
// 주문횟수가 2이상이면서 MaxCnt랑 같은 경우
if(entry.getValue() >= 2 && entry.getValue() == MaxCnt[len]) {
list.add(entry.getKey()); // 메뉴구성
}
}
}
Collections.sort(list);
String[] answer = new String[list.size()];
for(int i=0; i<list.size(); i++) {
answer[i] = list.get(i);
}
return answer;
}
}
|
cs |
// 복습
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
|
import java.util.*;
class Solution {
// 메뉴 길이별 값을 쌍으로 관리한다.
List<Map<String, Integer>> FoodMaps = new ArrayList<>();
// 메뉴 길이별 값중 가장 큰 값을 관리한다.
int[] MaxCnt = new int[11];
// comb : 모든 문자열 조합을 만드는 메서드
void comb(char[] str, int pos, StringBuilder candi) {
// 기저조건 : 현재 문자열의 길이가 전체 주어진 문자열의 길이와 같을경우.
if(pos >= str.length) {
// 메뉴의 개수
int len = candi.length();
// 메뉴의 메뉴의 개수가 2개 이상일 때만 의미가 있다.
if(len >= 2) {
// 해당 idx(len)메뉴의 개수의 위치에서 메뉴가 없으면 0을 있으면 있는 숫자를 가져와서 + 1 해준다.
int cnt = FoodMaps.get(len).getOrDefault(candi.toString(), 0) + 1;
// 해당위치에 메뉴와 메뉴의 카운트를 담아준다.
FoodMaps.get(len).put(candi.toString(), cnt);
MaxCnt[len] = Math.max(MaxCnt[len], cnt);
}
return;
}
// 다음 문자열을 선택한다.
comb(str, pos+1, candi.append(str[pos]));
// 다음 문자열을 선택안한다.
candi.setLength(candi.length() - 1);
comb(str, pos+1, candi);
}
public String[] solution(String[] orders, int[] course) {
// course 배열의 크기는 1 이상 10 이하 라고 주어졌으니 미리 공간을 만들어 둔다.
for(int i=0; i<=10; i++) FoodMaps.add(new HashMap<String, Integer>());
// 메뉴의 모든 조합을 만든다.
for(String str : orders) {
char[] arr = str.toCharArray();
Arrays.sort(arr);
comb(arr, 0, new StringBuilder());
}
// 요청한 코스에 맞춰 메뉴를 찾는다.
List<String> list = new ArrayList<>();
for(int len : course) {
for(Map.Entry<String, Integer> entry : FoodMaps.get(len).entrySet()) {
// 주문횟수가 2이상이면서 MaxCnt랑 같은 메뉴들을 찾는다.
if(entry.getValue() >= 2 && entry.getValue() == MaxCnt[len]) {
// 해당 메뉴구성을 담는다.
list.add(entry.getKey());
}
}
}
// 정렬해준다.
Collections.sort(list);
// 답을 반환한다.
String[] answer = new String[list.size()];
for(int i=0; i<list.size(); i++) {
answer[i] = list.get(i);
}
return answer;
}
}
|
cs |
// 핵심 아이디어
반응형
'CS > 알고리즘_KAKAO BLIND RECRUITMENT' 카테고리의 다른 글
2018 KAKAO BLIND RECRUITMENT : [3차] 자동완성 (0) | 2021.10.11 |
---|---|
2020 KAKAO BLIND RECRUITMENT : 괄호 변환 (0) | 2021.10.10 |
2018 KAKAO BLIND RECRUITMENT : [1차] 추석 트래픽 (0) | 2021.10.06 |
2018 KAKAO BLIND RECRUITMENT : [1차] 셔틀버스 (0) | 2021.10.05 |
2020 KAKAO BLIND RECRUITMENT : 자물쇠와 열쇠 (0) | 2021.10.04 |