알고리즘 풀이/프로그래머스

[프로그래머스][JAVA] 순위 검색 (HashMap, 이진탐색, LowerBound찾기, 비트연산)

배게 2021. 9. 7. 04:14
728x90

 

 

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
66
67
68
69
70
71
72
73
74
75
76
77
78
import java.util.*;
 
class Solution {
    Map<String, Integer> Wordmap = new HashMap<>();
    List<List<Integer>> ScoreList = new ArrayList<>();
 
    public int[] solution(String[] info, String[] query) {
        Wordmap.put("-"0);
        Wordmap.put("cpp"1);
        Wordmap.put("java"2);
        Wordmap.put("python"3);
        Wordmap.put("backend"1);
        Wordmap.put("frontend"2);
        Wordmap.put("junior"1);
        Wordmap.put("senior"2);
        Wordmap.put("chicken"1);
        Wordmap.put("pizza"2);
 
        for(int i=0; i<4*3*3*3; i++) {
            ScoreList.add(new ArrayList<>());
        }
 
        for(String str : info) {
            String[] word = str.split(" ");
            int[] arr = { 
                    Wordmap.get(word[0])*3*3*3,
                    Wordmap.get(word[1])*3*3,   
                    Wordmap.get(word[2])*3
                    Wordmap.get(word[3])};
            int score = Integer.parseInt(word[4]);
 
            for(int i=0; i<(1<<4); i++) {
                int idx = 0;
                for(int j=0; j<4; j++) {
                    if((i & (1<<j)) != 0 ) {
                        idx+= arr[j];
                    }
                }
                ScoreList.get(idx).add(score);
            }
        }
 
        for(int i=0; i<4*3*3*3; i++
            Collections.sort(ScoreList.get(i));
 
 
 
 
        int[] answer = new int[query.length];
        for(int i=0; i<query.length; i++) {
            String[] word = query[i].split(" ");
            int idx = 
                    Wordmap.get(word[0])*3*3*3+
                    Wordmap.get(word[2])*3*3+
                    Wordmap.get(word[4])*3+
                    Wordmap.get(word[6]);
            int score = Integer.parseInt(word[7]);
 
            int ret = Collections.binarySearch(ScoreList.get(idx), score);
            if(ret<0) {
                ret = -(ret+1);
            }else {
                for(int j=ret-1; j>=0; j--) {
                    if(ScoreList.get(idx).get(j)==score) {
                        ret = j;
                    }else {
                        break;
                    }
 
                }
            }
            answer[i] = ScoreList.get(idx).size()-ret;
 
        }
 
        return answer;
    }
}
cs

효율성에서 오류가 안나려면

완전탐색이 아닌 binarySearch를 해주어야 하고

62~68 Line에서 중복된 값에서 LowerBound를 찾는 조건(score가 같은 경우)를 충족시키지 못할 때

반드시 break문을 걸어서 반복문을 탈출해줘야한다 (이것 때문에 효율성에서 걸림)

댓글수0