Skip to content

Commit c1b7af3

Browse files
committed
[String] baekjoon-13505
1 parent 7acd739 commit c1b7af3

File tree

4 files changed

+96
-0
lines changed

4 files changed

+96
-0
lines changed

โ€ŽREADME.md

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
| 02 | | [Baekjoon-14426 ์ ‘๋‘์‚ฌ ์ฐพ๊ธฐ](./src/String/P14426) | |
3030
| 03 | | [Baekjoon-1786 ์ฐพ๊ธฐ](./src/String/P1786) | KMP |
3131
| 04 | | [Baekjoon-1305 ๊ด‘๊ณ ](./src/String/P1305) | KMP |
32+
| 05 | โญ๏ธ | [Baekjoon-13505 ๋‘ ์ˆ˜ XOR](./src/String/P13505) | |
3233

3334
## Data Structure
3435

โ€Žsrc/String/P13505/Main.java

+73
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package String.P13505;
2+
3+
import java.io.*;
4+
import java.util.*;
5+
6+
public class Main {
7+
8+
static int N;
9+
static String[] bin_nums;
10+
static Trie trie = new Trie();
11+
12+
public static void main(String[] args) throws Exception {
13+
System.setIn(new FileInputStream("src/String/P13505/input.txt"));
14+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
15+
N = Integer.parseInt(br.readLine());
16+
StringTokenizer st = new StringTokenizer(br.readLine());
17+
18+
bin_nums = new String[N];
19+
for (int i = 0; i < N; i++) {
20+
bin_nums[i] = toBinaryStr(Integer.parseInt(st.nextToken()));
21+
trie.insert(bin_nums[i]);
22+
}
23+
24+
int max = Integer.MIN_VALUE;
25+
for (int i = 0; i < N; i++) {
26+
max = Math.max(max, trie.findMaxXOR(bin_nums[i]));
27+
}
28+
System.out.println(max);
29+
}
30+
31+
private static String toBinaryStr(int num) {
32+
StringBuilder sb = new StringBuilder();
33+
for (int i = 30; i >= 0; i--)
34+
sb.append(((1 << i) & num) > 0 ? '1' : '0');
35+
return sb.toString();
36+
}
37+
}
38+
39+
class Trie {
40+
Node root = new Node();
41+
42+
void insert(String s) {
43+
Node current = root;
44+
for (int i = 0; i < s.length(); i++) {
45+
int n = s.charAt(i) == '0' ? 0 : 1;
46+
if (current.next[n] == null)
47+
current.next[n] = new Node();
48+
current = current.next[n];
49+
}
50+
}
51+
52+
int findMaxXOR(String s) {
53+
StringBuilder sb = new StringBuilder();
54+
Node current = root;
55+
for (int i = 0; i < s.length(); i++) {
56+
int n = s.charAt(i) == '0' ? 0 : 1;
57+
int opposite = n ^ 1;
58+
if (current.next[opposite] != null) {
59+
sb.append('1');
60+
current = current.next[opposite];
61+
} else {
62+
sb.append('0');
63+
current = current.next[n];
64+
}
65+
66+
}
67+
return Integer.parseInt(sb.toString(), 2);
68+
}
69+
70+
private static class Node {
71+
Node[] next = new Node[2];
72+
}
73+
}

โ€Žsrc/String/P13505/README.md

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
## [baekjoon-13505] ๋‘ ์ˆ˜ XOR
2+
3+
![image](https://user-images.githubusercontent.com/22045163/103462635-f1e2a780-4d69-11eb-81dc-046de3907843.png)
4+
5+
### ํ’€์ด ๊ณผ์ •
6+
7+
XOR ์—ฐ์‚ฐ์€ 0๊ณผ 1, 1๊ณผ 0์ฒ˜๋Ÿผ ๋‘ ์ˆ˜๊ฐ€ ๋‹ค๋ฅผ ๋•Œ 1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ํŠน์„ฑ์„ ์ƒ๊ฐํ•ด๋ดค์„ ๋•Œ
8+
์ฃผ์–ด์ง„ ์ˆ˜์— ๋Œ€ํ•ด XORํ•œ ๊ฐ’์ด ์ตœ๋Œ€๊ฐ€ ๋˜๋ ค๋ฉด ๊ฐ ์ž๋ฆฌ์˜ ์ˆ˜๊ฐ€ ์„œ๋กœ ์ตœ๋Œ€ํ•œ ๋‹ฌ๋ผ์•ผ ํ•œ๋‹ค.
9+
์ด๋ฅผ ํšจ์œจ์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํŠธ๋ผ์ด๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ ์ˆ˜๋ฅผ ์ด์ง„์ˆ˜๋กœ ๋ฐ”๊ฟ” ํŠธ๋ผ์ด์— ๋„ฃ๊ณ ,
10+
XORํ•œ ๊ฐ’์ด ์ตœ๋Œ€๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋ฅผ ์ฐพ์•„๋‚˜๊ฐ€๋Š” ๊ฒƒ์ด๋‹ค.
11+
12+
์ด์ง„์ˆ˜์™€ XOR์—ฐ์‚ฐ ๋ฌธ์ œ์ธ๋ฐ, ํŠธ๋ผ์ด๋ฅผ ์จ์„œ ํ’€ ์ˆ˜ ์žˆ๋Š” ์‹ ๊ธฐํ•˜๊ณ  ์žฌ๋ฐŒ๋Š” ๋ฌธ์ œ์˜€๋‹ค !!
13+
14+
![image](https://user-images.githubusercontent.com/22045163/103462660-163e8400-4d6a-11eb-8ca6-54962c87ca0b.png)

โ€Žsrc/String/P13505/input.txt

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
6
2+
1 2 4 8 16 32
3+
4+
5
5+
0 1 0 1 0
6+
7+
5
8+
1 2 3 4 5

0 commit comments

Comments
ย (0)