https://school.programmers.co.kr/learn/courses/30/lessons/72412
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로 하여 정렬할 수 있다는 점을 배웠다.
'Programmers' 카테고리의 다른 글
[프로그래머스][JAVA]Lv. 2 - 행렬 테두리 회전하기 (0) | 2023.10.22 |
---|---|
[프로그래머스][JAVA]Lv. 2 - 괄호 회전하기 (1) | 2023.10.15 |
[프로그래머스][JAVA]Lv. 2 - 이진 변환 반복하기 (1) | 2023.09.25 |
[프로그래머스][JAVA]Lv. 2 - 쿼드압축 후 개수 세기 (0) | 2023.09.25 |
[프로그래머스][JAVA]Lv. 2 - 튜플 (0) | 2023.09.25 |