알고리즘

[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를 검색할때마다 정렬하는게 아니라 처음에 한번 해줘야하는거.?

그리고 이진탐색 잠시 까먹었는데 다시 한번 정리하고가기~