programmers_순위 검색_java

2023. 5. 25. 12:16Algorithm/Programmers

728x90

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

import java.util.*;

class Solution {
    public int[] solution(String[] info, String[] query) {
        int[] answer = new int[query.length];

        // [언어, 직군, 경력, 소울푸드, 점수]
        String[][] infos = new String[info.length][5];
        String[][] querys = new String[query.length][5];
        Map<String, ArrayList<Integer>> map = new HashMap<>();

        // info 정보
        int idx = 0;
        for (String s : info){
            infos[idx] = s.split(" ");
            infoInput(infos[idx++], "", 0, map);
        }
        // map의 score 정보 정렬
        for (Map.Entry<String, ArrayList<Integer>> m : map.entrySet()){
            Collections.sort(m.getValue());
//            System.out.println(m.getValue());
        }

        // query 정보
        idx = 0;
        for (String s : query){
            s = s.replaceAll(" and ", "");
            querys[idx] = s.split(" ");
            answer[idx] = countApplicant(querys[idx][0], Integer.parseInt(querys[idx][1]), map);
            idx++;
        }

        return answer;
    }

    // map에 경우의 수 추가
    public void infoInput(String info[], String s, int cnt, Map<String, ArrayList<Integer>> map){
        if (cnt == 4){
            if (map.containsKey(s)){
                map.get(s).add(Integer.parseInt(info[cnt]));
            }else {
                ArrayList<Integer> l = new ArrayList<>();
                l.add(Integer.parseInt(info[cnt]));
                map.put(s, l);
            }
            return;
        }

        infoInput(info, s+"-", cnt+1, map); // 조건 포함 X
        infoInput(info, s+info[cnt], cnt+1, map); // 조건 포함
    }

    // 쿼리 조건에 맞는 지원자 수 검색
    public int countApplicant(String query, int score,Map<String, ArrayList<Integer>> map){
        int cnt = 0;
        if (map.containsKey(query)){
            cnt = findFitScore(score, map.get(query));
        }else {
            cnt = 0;
        }
        return cnt;
    }

    // 해당 점수 찾기 
    public int findFitScore(int score, List<Integer> list){
        int left = 0;
        int right = list.size();
        int mid = 0;
        //(lowerBound)
        while (left < right){
            mid = (left+right)/2;
            if (score > list.get(mid)){
                left = mid + 1;
            } else{
                right = mid;
            }
        }
        
        // 전체 - 해당 점수 보다 작은 것의 갯수
        return list.size() - right;
    }
}