본문 바로가기

Programmers

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

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) {
        ArrayList<Integer> ans = new ArrayList<>();
        String[] language = {"cpp", "java", "python", "-"};
        String[] position = {"backend", "frontend", "-"};
        String[] career = {"junior", "senior", "-"};
        String[] food = {"chicken", "pizza", "-"};
        HashMap<String, ArrayList<Integer>> hashMap = new HashMap<>();
        for (int i = 0; i < language.length; i++) {
            for (int j = 0; j < position.length; j++) {
                for (int k = 0; k < career.length; k++) {
                    for (int l = 0; l < food.length; l++) {
                        hashMap.put(language[i]+position[j]+career[k]+food[l], new ArrayList<>());
                    }
                }
            }
        }
        for (int i = 0; i < info.length; i++) {
            String[] volInfo = info[i].split(" ");
            String[] volLanguage = {volInfo[0], "-"};
            String[] volPosition = {volInfo[1], "-"};
            String[] volCareer = {volInfo[2], "-"};
            String[] volFood = {volInfo[3], "-"};

            for (int j = 0; j < volLanguage.length; j++) {
                for (int k = 0; k < volPosition.length; k++) {
                    for (int l = 0; l < volCareer.length; l++) {
                        for (int m = 0; m < volFood.length; m++) {
                            hashMap.get(volLanguage[j]+volPosition[k]+volCareer[l]+volFood[m]).add(Integer.parseInt(volInfo[4]));
                        }
                    }
                }
            }
        }
        for (List<Integer> score : hashMap.values()) {
            Collections.sort(score);
        }
        for (int i = 0; i < query.length; i++) {
            query[i] = query[i].replaceAll(" and ", "");
            String[] queryInfo = query[i].split(" ");
            int queryScore = Integer.parseInt(queryInfo[1]);
            String q = queryInfo[0];

            ArrayList<Integer> scores = hashMap.get(q);
            int cnt = binarySearch(scores, queryScore);
            ans.add(scores.size() - cnt);
        }

        int[] answer = new int[ans.size()];
        for (int i = 0; i < ans.size(); i++) {
            answer[i] = ans.get(i);
        }
        return answer;
    }

    public int binarySearch(ArrayList<Integer> scores, int queryScore) {
        int left = 0;
        int right = scores.size() - 1;
        int value = scores.size();

        while (left <= right) {
            int mid = (left + right) / 2;
            if (queryScore <= scores.get(mid)) {
                value = mid;
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }

        return value;
    }
}

가능한 모든 경우를 hashMap에 저장

주어진 info배열을 적절히 split으로 분해하여 hashMap에 저장된 경우에 score를 값으로 추가

score값을 정렬해 준 뒤 쿼리에 따라 hashMap에 저장된 score를 이진탐색 실행하여 조건에 맞는

score의 개수(전체 개수 - 조건에 맞는 score의 첫 인덱스)를 구하여 answer에 추가해 주었다

최대한 실행시간을 줄이는 것이 중요했던 문제

HashMap의 Key, Value 중에 Value를 List로 하여 정렬할 수 있다는 점을 배웠다.