알고리즘
[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를 검색할때마다 정렬하는게 아니라 처음에 한번 해줘야하는거.?
그리고 이진탐색 잠시 까먹었는데 다시 한번 정리하고가기~