알고리즘

프로그래머스 Lv.2 순위검색-JAVA

jaewoo 2023. 3. 29. 14:09

 

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

 

프로그래머스

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

programmers.co.kr

https://coding-grandpa.tistory.com/104

 

[2021 카카오 코딩테스트] 순위 검색 - 자바 java

0. 자세한 설명은 YouTube 영상으로 1. Hash + 이분 탐색을 활용한 solution import java.util.*; class Solution { public int[] solution(String[] info, String[] query) { // 1. info를 기반으로 hashMap 만들기 HashMap hashMap = new HashMap

coding-grandpa.tistory.com

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;

class Solution {
   public int[] solution(String[] info, String[] query){
        // 1. info를 기반으로 hashMap 만들기
        HashMap<String, ArrayList<Integer>> hashMap = new HashMap<>();

        for(String i : info){
            String[] data = i.split(" ");   //"java backend junior pizza 150" 하나씩 쪼갬
            String[] languages = {data[0] , "-"}; //{java,"-"}
            String[] jobs = {data[1],"-"};//{backend,"-"}
            String[] exps = {data[2],"-"};
            String[] foods = {data[3],"-"};
            Integer value = Integer.parseInt(data[4]);

            for(String lang : languages){
                for(String job :jobs){
                    for(String exp : exps){
                        for(String food: foods){
                            String[] keyData ={lang,job,exp,food};
                            String key = String.join(" ",keyData); //for문을 통해 두 개중 들어온 하나로 이어붙힘

                            ArrayList<Integer> arr = hashMap.getOrDefault(key,new ArrayList<>());   //Key에 맞는 value를 주던가 없으면 새로운 리스트
                            arr.add(value);
                            hashMap.put(key,arr);

                        }
                    }
                }
            }
        }

        for(ArrayList<Integer> list : hashMap.values()){
            Collections.sort(list);
        }

        // query 조건에 맞는 지원자 찾기
        int[] answer = new int[query.length];
        int i =0;

        for(String q : query){
            String[] data = q.split(" and ");   //"java and backend and junior and pizza 100" and로 쪼개면 3번 pizza 100으로 들어옴
            int target = Integer.parseInt(data[3].split(" ")[1]);
            data[3] = data[3].split(" ")[0];
            String key  = String.join(" ",data);
            
            if(hashMap.containsKey(key)){
                ArrayList<Integer> list = hashMap.get(key);
                
                int left = 0;
                int right = list.size();
                
                while(left < right){
                    int mid = (left+right)/2;
                    
                    if(list.get(mid) >= target){
                        right = mid;
                    }else{
                        left = mid+1;
                    }
                }
                answer[i] = list.size() - left; //left는 해당 범위까지 증가한다.
                
            }  
            i++;
            
        }

        return answer;
    }
}