강의로 돌아가기
정성수

혹시 Java에서 효율성 테스트에서 막히고 계신 분들은

혹시 자신의 코드가 Query를 순회할 때마다 ArrayList<>를 정렬하고 있는지를 확인해보세요.
info를 순회하면서 가능한 모든 조합에 점수를 넣기 -> 점수들이 들어있는 ArrayList 전체를 정렬하기 -> query를 순회하면서 점수보다 높은 사람들 수 구하기 이런 로직으로 해결하시면 금방 해결하실 수 있을 겁니다.

작성중인 코드―Solution.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import java.util.*;

class Solution {
    static HashMap<String, ArrayList<Integer>> scoreMap;
    static int score;
    static String[] strings;
    static String[] sInfoArr;

    static void dfs(int lv) {
        if (lv == 4) {
            String str = String.join("", strings);
            if (!scoreMap.containsKey(str))
                scoreMap.put(str, new ArrayList<>());
            scoreMap.get(str).add(score);
        }else {
            strings[lv] = sInfoArr[lv];
            dfs(lv + 1);
            strings[lv] = "-";
            dfs(lv + 1);
        }
    }
    static int lowerBound(ArrayList<Integer> list, int key) {
        int left = 0, right = list.size() - 1;

        while (left <= right) {
            int mid = (left + right) / 2;

            if (list.get(mid) < key)
                left = mid + 1;
            else
                right = mid - 1;
        }

        return left;
    }

    public static int[] solution(String[] info, String[] query) {
        scoreMap = new HashMap<>();

        for (String sInfo : info) {
            strings = new String[4];
            sInfoArr = sInfo.split(" ");
            score = Integer.parseInt(sInfoArr[4]);
            dfs(0);
        }

        for (String key : scoreMap.keySet())
            Collections.sort(scoreMap.get(key));

        int idx = 0;
        int[] answer = new int[query.length];
        for (String q : query) {
            String[] strs = q.split(" and | ");
            String key = strs[0] + strs[1] + strs[2] + strs[3];

           if (!scoreMap.containsKey(key))
               answer[idx++] = 0;
           else {
               ArrayList<Integer> ansList = scoreMap.get(key);
               answer[idx++] = ansList.size() - lowerBound(ansList, Integer.parseInt(strs[4]));
           }
        }
        return answer;
    }
}
  • 문윤지

    글보고 도움 많이 됐습니다, 감사합니다. 궁금한 점이 line 47~48에서 모든 key의 value들을 sorting해주셨는데, line 59에서 나온 array에 대해서만 sorting하지 않고, 모든 value들에 대해 정렬해줘야 하는 이유가 있을까요? 정렬하는 경우는 key가 포함되어있는 value만 정렬하는게 더 적은 경우로 정렬해서 더 좋을 것 이라 생각하는데, 그렇게 코드를 짤 경우 효율성에서 통과되지 않네요..

    문윤지―2022.06.28 16:45
  • 정성수

    가능한 모든 query의 개수를 생각해보면 4 * 3 * 3 * 3 = 108가지이고, query는 최대 100000개 주어지므로, 혹시 이미 정렬한 리스트를 다시 정렬하는 경우가 생기지 않을까 생각해보시면 금방 답을 찾을거에요

    정성수―2022.06.30 14:38
  • 문윤지

    4가지로만 구성된 쿼리가 중복될 수 있다는 생각을 못했네요.!! 답변 감사합니다!

    문윤지―2022.07.01 00:00
  • Denia-park

    좋은 정보 감사합니다. 잘 보고 갑니다.

    Denia-park―2022.09.03 20:35
  • Denia-park

    split(" and | ") 이게 된다는것도 잘 배워갑니다 ㅎㅎ.

    Denia-park―2022.09.03 20:35
  • changmeen

    그냥 코드만 봐서는 전혀 이해가 안되서 직접 써보면서 주석까지 달아가면서 겨우 이해를 했네요.. 너무 어렵습니다.... ㅠ

    changmeen―2023.04.25 16:37
0 개의 답변
답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다. 마크다운 가이드 를 참고하세요.