알고리즘
[프로그래머스] 순위 검색 - java
minkang
2021. 8. 27. 16:29
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
import java.util.*;
class Solution {
static HashMap<String, List<Integer>> map = new HashMap<>();
public int[] solution(String[] info, String[] query) {
int[] answer = new int[query.length];
for(int i=0; i<info.length; i++) {
dfs("", info[i].split(" "), 0);
}
for(String key :map.keySet()) {
Collections.sort(map.get(key));
}
for(int i=0; i<query.length; i++) {
String temp[] = query[i].replace(" and ", "").split(" ");
int score = Integer.parseInt(temp[1]);
answer[i] = binarySearch(temp[0], score);
}
return answer;
}
private int binarySearch(String string, int score) {
if(map.containsKey(string)) {
List<Integer> list = map.get(string);
int left = 0;
int right = list.size()-1;
if(list.get(right) < score) {
return 0;
}
while(left<right) {
int mid = (left+right)/2;
if(list.get(mid) < score) {
left = mid+1;
}
else{
right = mid;
}
}
return list.size() - left;
}
return 0;
}
private void dfs(String s, String[] info, int depth) {
if(depth == 4) {
if(map.containsKey(s) == false) {
List<Integer> list = new ArrayList<Integer>();
list.add(Integer.parseInt(info[4]));
map.put(s, list);
}
else {
map.get(s).add(Integer.parseInt(info[4]));
}
return;
}
dfs(s+"-", info, depth+1);
dfs(s+info[depth], info, depth+1);
}
}
선형적으로 풀면 info 배열의 최대 크기는 5만, query 배열의 최대 크기는 10만 이므로 최대 50억 연산을 하게 되므로 효율성을 통과하지 못하므로 이분탐색을 활용해주었습니다.
java backend junior pizza 150 의 경우
```
- backend junior pizza
java - junior pizza
java backend - pizza
java backend junior -
- - junior pizza
- backend - pizza
~~~~~
```
처럼 16개로 표현할 수 있다.
dfs를 활용해 해쉬맵에 모든 경우의 수를 <String, List> 형식으로 등록한 후에
쿼리문을 해쉬맵에 참조해 이분탐색을 활용해 풀 수 있습니다.