알고리즘
[Algorithm/Java] kakao 2021 메뉴 리뉴얼
지수쓰
2021. 7. 1. 16:53
반응형
import java.util.*;
class Solution {
/*
새로 알아볼 것 : ArrayList, HashMap 라이브러리 사용법
sort
순열, 조합 방식
map iterator, for each
*/
private static ArrayList<HashMap<String,Integer>> maps = new ArrayList<>(11);
// length길이만큼 만들수 있는 조합 뽑고 MAP에 넣기
static void perm(char[] chars, int[] visit, int now, int depth, int length){
if(depth>=2 && depth==length){
String tmp = "";
//사전순으로 입력해놓기위함
int[] str = new int[26];
for(int i=0; i<chars.length; i++){
if(visit[i]==1){
str[chars[i]-'A']++;
}
}
for(int i=0; i<26; i++){
if(str[i]!=0)tmp+=(char)(i+'A');
}
// 이미 존재한다면 개수를 늘려줌 -> 여기 MAX값으로 나중에 꺼낼 예정
if(maps.get(length).isEmpty()){
maps.get(length).put(tmp,1);
}
else if(maps.get(length).containsKey(tmp)){
int cnt = maps.get(length).get(tmp);
maps.get(length).replace(tmp, cnt+1);
}
else {
maps.get(length).put(tmp,1);
}
return;
}
for(int i=now; i<chars.length; i++){
if(visit[i]==0){
visit[i]=1;
perm(chars, visit, i, depth+1, length);
visit[i]=0;
}
}
}
public String[] solution(String[] orders, int[] course) {
//초기화
maps.clear();
for(int i=0; i<11 ; i++){
HashMap<String, Integer> tmp = new HashMap<String, Integer>();
tmp.put("",0);
maps.add(tmp);
}
// 조합
for(String order : orders){
char[] chars = order.toCharArray();
int[] visit = new int[10];
for(int i=0; i<10; i++){
visit[i]=0;
}
for(int i=2; i<=chars.length; i++){
for(int j=0; j<chars.length-1; j++){
visit[j]=1;
perm(chars, visit, j, 1, i);
visit[j]=0;
}
}
}
// 꺼내서 max 개수 찾고 그 max개수에 맞는 값 가져옴
ArrayList<String> ans = new ArrayList<String>();
int idx = 0;
for(int c=0; c<course.length; c++){
int i = course[c];
if(!maps.get(i).isEmpty()){
int max=0;
for(Map.Entry<String, Integer> map : maps.get(i).entrySet()){
if(map.getValue()>max ){
max = map.getValue();
}
}
for(Map.Entry<String, Integer> map : maps.get(i).entrySet()){
if(max>=2 && map.getValue()==max ){
ans.add(map.getKey());
idx++;
}
}
}
}
//정렬
ans.sort(Comparator.naturalOrder());
for( String s : ans){
System.out.println(s);
}
String[] answer = ans.toArray(new String[ans.size()]);
return answer;
}
}
뭔가 예전에 진짜 풀때 문제 이해도 안되고 틀렸던 기억이있는데..
주먹구구지만 풀려서 기쁘다 >.<
다른사람들 코드 보면서 공부해야징
다시 푼 풀이 22.2.7
시간이게더 줄었음
import java.util.*;
class Solution {
class Order implements Comparable<Order>{
String set;
int cnt;
Order(String set, int cnt) {
this.set=set;
this.cnt=cnt;
}
@Override
public int compareTo(Order o1) {
return o1.cnt - this.cnt;
}
}
HashMap<String, Integer> map;
ArrayList<String> results;
public String[] solution(String[] orders, int[] course) {
results= new ArrayList<>();
for(int i=0; i<course.length; i++) {
permute(orders, course[i]);
}
Collections.sort(results);
String[] answer = new String[results.size()];
for(int i=0; i<results.size(); i++){
answer[i] = results.get(i);
}
return answer;
}
public void permute(String[] orders, int len) {
map = new HashMap<>();
for(int i=0; i<orders.length; i++){
int [] visit = new int[orders[i].length()];
if(orders[i].length() < len) continue;
for(int j=0; j<visit.length; j++) {
visit[j]=1;
dfs( j, 1, len, visit, orders[i]);
visit[j]=0;
}
}
ArrayList<Order> lists = new ArrayList<>();
for(Map.Entry<String,Integer> entry: map.entrySet()) {
lists.add(new Order(entry.getKey(), entry.getValue()));
}
Collections.sort(lists);
int maxcnt =0;
if(lists.size()>0) maxcnt = lists.get(0).cnt;
if(maxcnt>=2){
for(Order order : lists) {
if(order.cnt==maxcnt) results.add(order.set);
else break;
}
}
}
public void dfs(int start, int r, int len, int[] visit, String order) {
if(r==len) {
StringBuilder sb = new StringBuilder();
char[] orderCharArr = order.toCharArray();
Arrays.sort(orderCharArr);
for(int i=0; i<visit.length; i++){
if(visit[i]==1) {
sb.append(orderCharArr[i]);
}
}
if(map.containsKey(sb.toString())) {
map.put(sb.toString(), map.get(sb.toString())+1);
}
else {
map.put(sb.toString(),1);
}
return;
}
for(int i=start+1; i<visit.length; i++){
visit[i]=1;
dfs(i, r+1, len, visit, order);
visit[i]=0;
}
}
}