Close
Close full mode
logo만렙 개발자 키우기

순위 검색

Git RepositoryEdit on Github
Last update: a year ago by nowwaterReading time: 2 min

문제

코드

코드 보기
import java.util.*;
class Solution {
static List<Integer> table[][][][] = new List[3][2][2][2];
public int[] solution(String[] info, String[] query) {
int[] answer = {};
List<Integer> ans = new ArrayList<>();
String infos[][] = new String[info.length][5];
String queries[][] = new String[query.length][5];
for (int i = 0; i < 3; i++)
for (int j = 0; j < 2; j++)
for (int k = 0; k < 2; k++)
for (int l = 0; l < 2; l++)
table[i][j][k][l] = new ArrayList<>();
/* parsing */
for (int i = 0; i < query.length; i++) {
String line = query[i];
int start = 0;
int end = line.indexOf(" ");
for (int j = 0; j < 4; j++) {
end = start + line.substring(start).indexOf(" ");
queries[i][j] = line.substring(start, end);
start = end + 5;
}
queries[i][4] = line.substring(end + 1);
}
for (int i = 0; i < info.length; i++) {
infos[i] = info[i].split(" ");
int lang = 0, job = 0, career = 0, food = 0;
if(infos[i][0].equals("java")) lang = 1;
else if(infos[i][0].equals("python")) lang = 2;
if(infos[i][1].equals("backend")) job = 1;
if(infos[i][2].equals("senior")) career = 1;
if(infos[i][3].equals("chicken")) food = 1;
table[lang][job][career][food].add(Integer.parseInt(infos[i][4]));
}
/* sort for binary search */
for (int i = 0; i < 3; i++)
for (int j = 0; j < 2; j++)
for (int k = 0; k < 2; k++)
for (int l = 0; l < 2; l++)
Collections.sort(table[i][j][k][l]);
/* query */
for (int i = 0; i < queries.length; i++) {
int ls = 0, le = 0, js = 0, je = 0, cs = 0, ce = 0, fs = 0, fe = 0, score = 0;
if(queries[i][0].equals("java")) ls = le = 1;
else if(queries[i][0].equals("python")) ls = le = 2;
else if(queries[i][0].equals("-")) {ls = 0; le = 2;}
if(queries[i][1].equals("backend")) js = je = 1;
else if(queries[i][1].equals("-")) { js = 0; je = 1; }
if(queries[i][2].equals("senior")) cs = ce = 1;
else if(queries[i][2].equals("-")) { cs = 0; ce = 1;}
if(queries[i][3].equals("chicken")) fs = fe = 1;
else if(queries[i][3].equals("-")) { fs = 0; fe = 1; }
score = Integer.parseInt(queries[i][4]);
int ansValue = 0;
for (int j = ls; j <= le; j++) {
for (int k = js; k <= je; k++) {
for (int l = cs; l <= ce; l++) {
for (int m = fs; m <= fe; m++) {
int n = table[j][k][l][m].size();
if(n == 0) continue;
int result = binSearch(table[j][k][l][m], score);
if(result == -1) continue;
ansValue += n - result;
}
}
}
}
ans.add(ansValue);
}
answer = new int[ans.size()];
for (int i = 0; i < ans.size(); i++)
answer[i] = ans.get(i);
return answer;
}
private static int binSearch(List<Integer> here, int score) {
int left = 0, right = here.size() - 1;
if(here.get(right) < score) return -1;
while(left <= right){
int mid = (left + right)/2;
if(here.get(mid) < score) left = mid + 1;
else right = mid - 1;
}
return left;
}
}

⭐️느낀점⭐️

풀면서 이렇게 푸는게 맞나.. 하면서 했는데 정확성 다 맞고 효율성 2개뺴고 다 맞는거 보고 다행이다 싶었다. -> 이분탐색을 떠올리긴 했는데 어떤 식으로 적용해야할지 몰라서 구현하지 못했다 ..ㅜㅜ

구현 문제를 많이 풀었었는데 그게 도움이 많이 됐던 것 같다.

문자열 파싱하는 부분이 아직 좀 부족하단걸 느꼈다.

풀이 📣


1️⃣ 입력된 정보를 최대한 조회하기 쉽도록 하기 위해 4차원 리스트 배열을 만들어서 각 카테고리별로 파싱해서 분류하였다.

- List<Integer> table[][][][] = new List[3][2][2][2]; // [언어][직군][경력][소울푸드]

2️⃣ 쿼리 중간에 and 부분을 문자의 인덱스를 +5 씩 해주면서 부분 문자열로 만들고, 다음 `` 의 인덱스를 구해서 부분 문자열을 잘라내었다.

- end = start + line.substring(start).indexOf(" ");
- line.substring(start, end); // 중간에 포함되는 정보들
- 마지막에 점수는 and 로 연결되지 않으므로 end + 1 부터 substring을 구하면 된다.

3️⃣ 각 카테고리별로 저장된 데이터들을 이분 탐색하기 위해 오름차순으로 정렬한다.

- Collections.sort(table[i][j][k][l]);

4️⃣ 카테고리별 저장된 인원 수 중 쿼리로 들어오는 점수 이상을 받는 인원을 이분탐색으로 찾아낸다.

- ansValue += (n - binSearch(table[j][k][l][m], score));

실수 😅

  • 효율성 테스트를 다 맞추기 위해서는 인원 수를 세어줄 때 이분탐색을 사용해야했다.

  • 그냥 모조리 세어서 시간초과가 발생하였던 것 같다.

👩‍💻 Problem Solving — Previous
메뉴 리뉴얼
Next — 👩‍💻 Problem Solving
합승 택시 요금