순위 검색

LJM·2023년 8월 24일
0

programmers

목록 보기
79/92

처음에는 HashMap 을 여러개 사용해서 하려고 했으나 "-" 때문에 포기..
찾아보고 이해하고 다시 풀어보았다. 그렇나 디버깅 한세월 걸렸다 하...

https://school.programmers.co.kr/learn/courses/30/lessons/72412

지원자의 4가지 항목을 가지고 16가지의 조합을 만들어서 키로 사용하고
키마다 해당 지원자가 몇명이 있는지 사용해서 푸는 방식이다

import java.util.*;

class Solution {
    public int[] solution(String[] info, String[] query) {
        
        
        HashMap<String, List<Integer>> map = new HashMap<>();
        
        for(String cand : info)
        {
            
            String[] input = cand.split(" ");
            int score = Integer.parseInt(input[4]);
            for(int i = 0; i < 16; ++i)
            {
                StringBuilder sb = new StringBuilder();
                for(int j = 0; j < 4; ++j)
                {
                    if((i & (1<<j))>0)
                    {
                        sb.append(input[j]);
                    }
                }
                
                //System.out.println(sb.toString());
                
                if(map.containsKey(sb.toString()))
                {
                    map.get(sb.toString()).add(score);    
                }
                else
                {
                    List<Integer> list = new ArrayList();
                    list.add(score);
                    map.put(sb.toString(), list);
                    
                }
            }
        }
        
        Set<String> keys = map.keySet();
        for(String key : keys)
        {
            if(map.containsKey(key))
            {
                List<Integer> list = map.get(key);   
                Collections.sort(list);
            }      
        }    
        
        ArrayList<Integer> arrAnswer = new ArrayList<>();
        for(String quri : query)
        {
            StringBuilder sb = new StringBuilder();
            String[] input = quri.split(" and | ");
            int score = Integer.parseInt(input[4]);
            
            sb.append(input[0]);
            sb.append(input[1]);
            sb.append(input[2]);
            sb.append(input[3]);
            
            String key = sb.toString().replaceAll("-","");
            //System.out.println(key);
            
            if(map.containsKey(key)==false)
            {
                arrAnswer.add(0);
                continue;
            }
                      
            List<Integer> list = map.get(key);
            
            int count = 0;
            int start = 0;
            int end = list.size()-1;
            int mid = 0;
            //System.out.println(list.size());
            
            while(start <= end)
            {
                mid = (start+end)/2;
                if(list.get(mid) < score)
                {
                    start = mid+1;
                }
                else{
                    end = mid-1;
                }
                    
                
                //System.out.println(start + "," + mid + "," + end);
            }
                       
            arrAnswer.add(list.size() - start);
        }
        
        int[] answer = new int[arrAnswer.size()];
        for (int i = 0; i < arrAnswer.size(); i++) {
            answer[i] = arrAnswer.get(i);
        }

        return answer;
    }
}
profile
게임개발자 백엔드개발자

0개의 댓글