forked from ndb796/python-for-coding-test
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path4.java
83 lines (72 loc) ยท 3.49 KB
/
4.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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import java.util.*;
class Solution {
public int lowerBound(ArrayList<String> arr, String target, int start, int end) {
while (start < end) {
int mid = (start + end) / 2;
// arr[mid]๊ฐ target๋ณด๋ค ์ฌ์ ์์ผ๋ก ๊ฐ๊ฑฐ๋ ๋ค์ ์๋ค๋ฉด
if (arr.get(mid).compareTo(target) >= 0) end = mid;
else start = mid + 1;
}
return end;
}
public int upperBound(ArrayList<String> arr, String target, int start, int end) {
while (start < end) {
int mid = (start + end) / 2;
// arr[mid]๊ฐ target๋ณด๋ค ์ฌ์ ์์ผ๋ก ๋ค์ ์๋ค๋ฉด
if (arr.get(mid).compareTo(target) > 0) end = mid;
else start = mid + 1;
}
return end;
}
// ๊ฐ์ด [left_value, right_value]์ธ ๋ฐ์ดํฐ์ ๊ฐ์๋ฅผ ๋ฐํํ๋ ํจ์
public int countByRange(ArrayList<String> arr, String leftValue, String rightValue) {
// ์ ์: lowerBound์ upperBound๋ end ๋ณ์์ ๊ฐ์ ๋ฐฐ์ด์ ๊ธธ์ด๋ก ์ค์
int rightIndex = upperBound(arr, rightValue, 0, arr.size());
int leftIndex = lowerBound(arr, leftValue, 0, arr.size());
return rightIndex - leftIndex;
}
// ๋ชจ๋ ๋จ์ด๋ค์ ๊ธธ์ด๋ง๋ค ๋๋์ด์ ์ ์ฅํ๊ธฐ ์ํ ๋ฆฌ์คํธ
public ArrayList<ArrayList<String>> arr = new ArrayList<ArrayList<String>>();
// ๋ชจ๋ ๋จ์ด๋ค์ ๊ธธ์ด๋ง๋ค ๋๋์ด์ ๋ค์ง์ด ์ ์ฅํ๊ธฐ ์ํ ๋ฆฌ์คํธ
public ArrayList<ArrayList<String>> reversedArr = new ArrayList<ArrayList<String>>();
public int[] solution(String[] words, String[] queries) {
ArrayList<Integer> ans = new ArrayList<Integer>();
// ๋จ์ด์ ๊ธธ์ด๋ 10,000๊น์ง ๊ฐ๋ฅ
for (int i = 0; i < 10001; i++) {
arr.add(new ArrayList<String>());
reversedArr.add(new ArrayList<String>());
}
// ๋ชจ๋ ๋จ์ด๋ฅผ ์ ๋ฏธ์ฌ ์์ผ๋์นด๋ ๋ฐฐ์ด, ์ ๋์ฌ ์์ผ๋์นด๋ ๋ฐฐ์ด์ ๊ฐ๊ฐ ์ฝ์
for (int i = 0; i < words.length; i++) {
String word = words[i];
arr.get(word.length()).add(word); // ๋จ์ด๋ฅผ ์ฝ์
word = (new StringBuffer(word)).reverse().toString();
reversedArr.get(word.length()).add(word); // ๋จ์ด๋ฅผ ๋ค์ง์ด์ ์ฝ์
}
// ์ด์ง ํ์์ ์ํํ๊ธฐ ์ํด ๊ฐ ๋จ์ด ๋ฆฌ์คํธ ์ ๋ ฌ ์ํ
for (int i = 0; i < 10001; i++) {
Collections.sort(arr.get(i));
Collections.sort(reversedArr.get(i));
}
// ์ฟผ๋ฆฌ๋ฅผ ํ๋์ฉ ํ์ธํ๋ฉฐ ์ฒ๋ฆฌ
for (int i = 0; i < queries.length; i++) {
String q = queries[i];
int res = 0;
if (q.charAt(0) != '?') { // ์ ๋ฏธ์ฌ์ ์์ผ๋ ์นด๋๊ฐ ๋ถ์ ๊ฒฝ์ฐ
res = countByRange(arr.get(q.length()), q.replaceAll("\\?", "a"), q.replaceAll("\\?", "z"));
}
else { // ์ ๋์ฌ์ ์์ผ๋ ์นด๋๊ฐ ๋ถ์ ๊ฒฝ์ฐ
q = (new StringBuffer(q)).reverse().toString();
res = countByRange(reversedArr.get(q.length()), q.replaceAll("\\?", "a"), q.replaceAll("\\?", "z"));
}
// ๊ฒ์๋ ๋จ์ด์ ๊ฐ์๋ฅผ ์ ์ฅ
ans.add(res);
}
// ๋ฐฐ์ด๋ก ๋ฐ๊พธ์ด ๋ฐํ
int[] answer = new int[ans.size()];
for (int i = 0; i < ans.size(); i++) {
answer[i] = ans.get(i);
}
return answer;
}
}