-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathJW_150367.java
More file actions
38 lines (36 loc) ยท 1.4 KB
/
JW_150367.java
File metadata and controls
38 lines (36 loc) ยท 1.4 KB
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
class JW_150367 {
public int[] solution(long[] numbers) {
int[] answer = new int[numbers.length];
for (int i = 0; i < numbers.length; i++) {
String str = toBinaryString(numbers[i]);
// ํํ ๊ฐ๋ฅํ ํฌํ ์ด์ง ํธ๋ฆฌ์ผ ๊ฒฝ์ฐ '1'
answer[i] = chkInOrder(str, 0, str.length() - 1) ? 1 : 0;
}
return answer;
}
// ํฌํ ์ด์ง ํธ๋ฆฌ -> ๋ฌธ์์ด ๊ธธ์ด๊ฐ 2^n - 1 ๊ผด์ด ๋์ด์ผ ํจ
private String toBinaryString(long number) {
StringBuilder sb = new StringBuilder(Long.toBinaryString(number));
int n = 1;
while (sb.length() > (1 << n) - 1) {
n++;
}
// ๋น ๋ถ๋ถ ์ฑ์ฐ๊ธฐ
sb.insert(0, "0".repeat((1 << n) - 1 - sb.length()));
return sb.toString();
}
// ์ค์ ํ์์ ์งํํ๋ฉด์ ๋ถ๊ฐ๋ฅํ ํธ๋ฆฌ์ธ์ง ํ์ธ
private boolean chkInOrder(String str, int l, int r) {
// ๋ฆฌํ๋
ธ๋ ์ผ ๊ฒฝ์ฐ๋ True
if (l == r)
return true;
int rootIdx = (l + r) / 2;
// ๋ฃจํธ ๋
ธ๋๊ฐ 0'์ผ ๊ฒฝ์ฐ์๋ ์์์ '1'์ด ์์ผ๋ฉด ์๋จ
if (str.charAt(rootIdx) == '0')
for (int i = l; i <= r; i++)
if (str.charAt(i) == '1')
return false;
// ๋ค์ ์ค์ ํ์
return chkInOrder(str, l, rootIdx - 1) && chkInOrder(str, rootIdx + 1, r);
}
}