-
[Algorithm/Java] kakao 2021 순위 검색알고리즘 2021. 7. 14. 00:29반응형
import java.util.stream.Stream; import java.util.*; class Solution { public static int[] solution(String[] info, String[] query) { Map<String, List<Integer> > infos= new HashMap<>(); for(String appliant : info){ String[] types = appliant.split(" "); for(int p=0; p<16; p++){ StringBuilder key = new StringBuilder(); if(p<8) key.append(types[0]); else key.append("-"); if((p>=0 &&p<4) || (p>=8 && p<12 )) key.append(types[1]); else key.append("-"); if((p>=0 &&p<2) || (p>=4 && p<6 ) || (p>=8 && p<10 ) || (p>=12 && p<14 )) key.append(types[2]); else key.append("-"); if(p%2==0) key.append(types[3]); else key.append("-"); infos.computeIfAbsent(key.toString(), s-> new ArrayList<>()).add(Integer.valueOf(types[4])); } } //여기서 sort를 먼저해줘야 query에서 했던걸 계속 하지 않음 for( Map.Entry<String, List<Integer>> entry : infos.entrySet() ){ entry.getValue().sort(null); } int[] answer = new int[query.length]; for(int i=0; i<query.length; i++){ String[] querySplit = query[i].split(" "); String findKey = querySplit[0]+ querySplit[2]+ querySplit[4]+ querySplit[6]; List<Integer> list = infos.getOrDefault(findKey, new ArrayList<>()); int score = Integer.parseInt(querySplit[7]); int s = 0, e = list.size(); // 이때 탐색 이진탐색으로 // 이진탐색 코드 mid+1유의하기 while(s<e){ int mid = (s+e)/2; if( list.get(mid) < score ) { s= mid+1; } else e=mid; } answer[i] = list.size()-s; } return answer; } }
sort를 검색할때마다 정렬하는게 아니라 처음에 한번 해줘야하는거.?
그리고 이진탐색 잠시 까먹었는데 다시 한번 정리하고가기~
'알고리즘' 카테고리의 다른 글
[Algorithm/Java] dev matching 로또의 최고순위와 최저순위 (0) 2021.07.14 [Algorithm/Java] kakao 2021 합승택시요금 (0) 2021.07.14 [Algorithm/Java] dev matching 행렬 테두리 회전하기 (0) 2021.07.14 [Algorithm/Java] kakao 2021 신규아이디 추천 (4) 2021.07.01 [Algorithm/Java] kakao 2021 메뉴 리뉴얼 (0) 2021.07.01