in.add()

[72412] 순위 검색 본문

Algorithm/Programmers

[72412] 순위 검색

idan 2021. 9. 7. 21:34

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/72412

 

코딩테스트 연습 - 순위 검색

["java backend junior pizza 150","python frontend senior chicken 210","python frontend senior chicken 150","cpp backend senior pizza 260","java backend junior chicken 80","python backend senior chicken 50"] ["java and backend and junior and pizza 100","pyt

programmers.co.kr

 

문제 해결 방법

query를 하나씩 보면서 info배열을 탐색하면 당연히 시간 초과가 날 거 같아서 info배열을 먼저 보면서 HashMap에 가능한 조합과 점수를 넣어줬다.

 

info가 "java backend junior pizza 150" 라면
javabackendjuniorpizza
-backendjuniorpizza
java-juniorpizza
javabackend-pizza
javabackendjunior-
--juniorpizza
java--pizza
.
.
.
등등의 query에 검색된다.
dfs를 이용해 모두 hashmap에 넣어준다.

 

첫 번째 시도

import java.util.*;

class Solution {
    static HashMap<String, ArrayList<Integer>> map;
    public int[] solution(String[] info, String[] query) {
        map = new HashMap<>();
        
        for(int i = 0; i < info.length; i++) {
            String[] infos = info[i].split(" ");
            dfs(0, "", infos);
        }

        int[] answer = new int[query.length];
        
        for(int i = 0; i < query.length; i++) {
            String[] filter = query[i].replace("and ", "").split(" ");
            String queryString = "";
            for(int j = 0; j < 4; j++) {
                queryString += filter[j];
            }

            int score = Integer.parseInt(filter[4]);
            if(!map.containsKey(queryString)) continue;
            ArrayList<Integer> list = map.get(queryString);
            int cnt = 0;
            for(int j = 0; j < list.size(); j++) {
                if(list.get(j) >= score) cnt++;
            }
            answer[i] = cnt;
        }
        return answer;
    }
    public void dfs(int cnt, String str, String[] infos) {
        if(cnt == 4) {
            int score = Integer.parseInt(infos[4]);
            if(!map.containsKey(str)) {
                ArrayList<Integer> list = new ArrayList<>();
                list.add(score);
                map.put(str, list);
            } else map.get(str).add(score);
            
            return;
        }
        
        dfs(cnt + 1, str + infos[cnt], infos);
        dfs(cnt + 1, str + "-", infos);
    }
}

정확성은 통과했지만 효율성을 하나도 통과하지 못했다..

 

두 번째 시도

score 비교를 위해 binary search를 추가했다.

import java.util.*;

class Solution {
    static HashMap<String, ArrayList<Integer>> map;
    public int[] solution(String[] info, String[] query) {
        map = new HashMap<>();
        
        for(int i = 0; i < info.length; i++) {
            String[] infos = info[i].split(" ");
            dfs(0, "", infos);
        }

        int[] answer = new int[query.length];
        
        for(int i = 0; i < query.length; i++) {
            String[] filter = query[i].replace("and ", "").split(" ");
            String queryString = "";
            for(int j = 0; j < 4; j++) {
                queryString += filter[j];
            }

            int score = Integer.parseInt(filter[4]);
            if(!map.containsKey(queryString)) continue;
            ArrayList<Integer> list = map.get(queryString);
            answer[i] = list.size() - bsearch(list, score);
        }
        return answer;
    }
    public void dfs(int cnt, String str, String[] infos) {
        if(cnt == 4) {
            int score = Integer.parseInt(infos[4]);
            if(!map.containsKey(str)) {
                ArrayList<Integer> list = new ArrayList<>();
                list.add(score);
                map.put(str, list);
            } else map.get(str).add(score);
            
            return;
        }
        
        dfs(cnt + 1, str + infos[cnt], infos);
        dfs(cnt + 1, str + "-", infos);
    }
    
    public int bsearch(ArrayList<Integer> list, int score) {
        Collections.sort(list);
        int min = 0;
        int max = list.size() - 1;
        while(min <= max) {
            int mid = (min + max) / 2;
            if(list.get(mid) < score) {
                min = mid + 1;
            } else {
                max = mid - 1;
            }
        }
        return min;
    }
}

 

ㅠㅠㅠㅠㅠㅠㅠㅠㅠ

 

세 번째 시도

query를 볼 때마다 정렬하는 게 아니라 HashMap을 완성하고, query를 보기 전에 정렬을 해줬다.

import java.util.*;

class Solution {
    static HashMap<String, ArrayList<Integer>> map;
    public int[] solution(String[] info, String[] query) {
        map = new HashMap<>();
        
        for(int i = 0; i < info.length; i++) {
            String[] infos = info[i].split(" ");
            dfs(0, "", infos);
        }

        map.forEach((key, value) -> {
            Collections.sort(value);    
        });
        
        int[] answer = new int[query.length];
        
        for(int i = 0; i < query.length; i++) {
            String[] filter = query[i].replace("and ", "").split(" ");
            String queryString = "";
            for(int j = 0; j < 4; j++) {
                queryString += filter[j];
            }

            int score = Integer.parseInt(filter[4]);
            if(!map.containsKey(queryString)) continue;
            ArrayList<Integer> list = map.get(queryString);
            answer[i] = list.size() - bsearch(list, score);
        }
        return answer;
    }
    public void dfs(int cnt, String str, String[] infos) {
        if(cnt == 4) {
            int score = Integer.parseInt(infos[4]);
            if(!map.containsKey(str)) {
                ArrayList<Integer> list = new ArrayList<>();
                list.add(score);
                map.put(str, list);
            } else map.get(str).add(score);
            return;
        }
        
        dfs(cnt + 1, str + infos[cnt], infos);
        dfs(cnt + 1, str + "-", infos);
    }
    
    public int bsearch(ArrayList<Integer> list, int score) {
        int min = 0;
        int max = list.size() - 1;
        while(min <= max) {
            int mid = (min + max) / 2;
            if(list.get(mid) < score) {
                min = mid + 1;
            } else {
                max = mid - 1;
            }
        }
        return min;
    }
}

 

!!!!!!!!!!!!

'Algorithm > Programmers' 카테고리의 다른 글

[42883] 큰 수 만들기  (0) 2021.09.14
[42746] 가장 큰 수  (0) 2021.09.13
[42885] 구명보트  (0) 2021.09.08
[72411] 메뉴 리뉴얼  (0) 2021.09.06
[81302] 거리두기 확인하기  (0) 2021.08.31
Comments