티스토리 뷰
https://programmers.co.kr/learn/courses/30/lessons/72411
코딩테스트 연습 - 메뉴 리뉴얼
레스토랑을 운영하던 스카피는 코로나19로 인한 불경기를 극복하고자 메뉴를 새로 구성하려고 고민하고 있습니다. 기존에는 단품으로만 제공하던 메뉴를 조합해서 코스요리 형태로 재구성해서
programmers.co.kr
풀이법:
1) courses에서 코스 구성 메뉴 개수 하나 씩 꺼내온다.
2) 각 손님이 시킨 오더 목록마다 코스 메뉴 개수만큼 이루어진 조합 다 구하고 hashmap에 조합 출현횟수 카운팅.
3) 모든 손님 오더 목록 다 돌고 나면 내림차순으로 정렬.
4) 제일 많이 출현한 조합 답 리스트에 추가.
5) courses 다 돌 때까지 1~4 반복.
Comment:
HashMap 정렬 생각해서 처음엔 TreeMap 생각했는데 보니까 Key 가 아니라 Value값 기준으로 정렬하는거라 결국 그냥 다 돌아야된다.
풀다가 정리가 좀 필요했던 내용:
1) 조합 구현
2) HashMap Value 기준으로 정렬하는 법
코드:
import java.util.*;
import java.util.Map.Entry;
class Solution {
static HashMap<String, Integer> hm = new HashMap();
static ArrayList<String> answer = new ArrayList();
public String[] solution(String[] orders, int[] course) {
for(int i = 0 ; i < course.length; i++) {
int r = course[i];
hm = new HashMap();
for(int j = 0 ; j < orders.length;j++) {
String order = orders[j];
boolean[] visited = new boolean[order.length()];
combination(order.toCharArray(), visited, 0, order.length(), r);
}
List<Entry<String, Integer>> list = new ArrayList<>(hm.entrySet());
list.sort(Entry.comparingByValue(Comparator.reverseOrder()));
list.forEach(System.out::println);
ArrayList<String> cands = new ArrayList();
if(!list.isEmpty()) {
Entry<String, Integer> max = list.get(0);
if(max.getValue() >= 2) {
for(Entry<String, Integer> entry : list) {
if(entry.getValue() == max.getValue())
cands.add(entry.getKey());
else
break;
}
answer.addAll(cands);
}
}
}
Collections.sort(answer);
answer.forEach(System.out::println);
int len = answer.size();
String[] ans = new String[len];
for(int i = 0 ; i < len; i++){
ans[i] = answer.get(i);
}
return ans;
}
static void combination(char[] arr, boolean[] visited, int start, int n, int r) {
if(r == 0) {
getCourse(arr, visited, n);
}
for(int i = start; i < n; i++) {
visited[i] = true;
combination(arr, visited, i+1, n, r-1);
visited[i] = false;
}
}
static void getCourse(char[] arr, boolean[] visited, int n) {
StringBuilder sb = new StringBuilder();
ArrayList<Character> ca = new ArrayList();
for(int i = 0; i < n; i++) {
if(visited[i]) {
System.out.print(arr[i] + " ");
ca.add(arr[i]);
}
}
Collections.sort(ca);
for(char c : ca) {
sb.append(c);
}
String comb = sb.toString();
if(hm.containsKey(comb)) {
hm.put(comb, hm.get(comb) + 1);
}else {
hm.put(comb, 1);
}
System.out.println();
}
}
'코딩테스트 > 기업코테' 카테고리의 다른 글
[2021 KAKAO INTERN] 숫자 문자열과 영단어 (JAVA) (0) | 2021.09.03 |
---|---|
[2020 KAKAO BLIND] 괄호변환 (JAVA) (0) | 2021.09.02 |
[2021 KAKAO BLIND] 신규 아이디 추천 (JAVA) (0) | 2021.08.23 |
[2020 카카오인턴] 수식 최대화 (0) | 2020.07.22 |
[2020 카카오인턴] 키보드 누르기 (0) | 2020.07.11 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- zipkin
- 모던 자바 인 액션
- KAKAO 2021
- WORA
- 카카오 인턴
- 카카오
- Java #GC #가비지콜렉터 #Garbage Collector
- decorator
- 스프링
- Java
- Kakao Blind
- jvm
- 신규 아이디 추천
- 카카오코테
- 디자인패턴
- spring cloud sleuth
- 2021
- 프로그래밍 모델
- WORE
- 코테
- PatternSyntaxException
- Java #JIT #JVM
- nginx 내부
- 2019 Kakao Blind
- 카카오 코테
- behavior parameterization
- IOC
- 2020 KAKAO
- okhttp3
- Spring
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함