## 접근
1. 주어진 노드의 x, y 좌표를 자료구조에 넣고 정렬한다. y는 내림차순으로, x는 오름차순으로 정렬한다. 정렬의 이유는 트리에 삽입하기 위해서다.
2. 루트 노드에서부터 시작하여, 노드를 넣기 위한 위치를 탐색한다. 노드의 x좌표를 기준으로, 작으면 왼쪽, 크면 오른쪽으로 탐색하다가, null을 만나면 삽입한다.
3. 전위순회와, 후위순회 코드를 작성할 때, 출력 부분을 이용해서 정답을 만든다.
## 해설코드(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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
import java.util.*;
import java.io.*;
import java.lang.*;
class Solution {
int[][] answer;
int preidx = 0;
int postidx = 0;
class Item{
int idx, x, y;
Item(int idx, int x, int y){
this.idx = idx;
this.x = x;
this.y = y;
}
}
class Node{
int num, x, y;
Node left = null;
Node right = null;
Node parent = null;
Node(int num, int x, int y){
this.num = num;
this.x = x;
this.y = y;
}
}
class Tree{
Node root = null;
void addNode(Node newNode){
if(root == null)
root = newNode;
else{
Node tNode = root;
while(true){
if(tNode.x > newNode.x){
// Left
if(tNode.left == null){
tNode.left = newNode;
newNode.parent = tNode;
break;
}else
tNode = tNode.left;
}else if(tNode.x < newNode.x){
// Right
if(tNode.right == null){
tNode.right = newNode;
newNode.parent = tNode;
break;
}else
tNode = tNode.right;
}
}
}
}
void pre(Node node){
if(node == null)
return;
answer[0][preidx++] = node.num;
pre(node.left);
pre(node.right);
}
void post(Node node){
if(node == null)
return;
post(node.left);
post(node.right);
answer[1][postidx++] = node.num;
}
}
public int[][] solution(int[][] nodeinfo) {
answer = new int[2][nodeinfo.length];
ArrayList<Item> aList = new ArrayList<>();
Tree tree = new Tree();
for(int i = 0; i < nodeinfo.length; i++){
aList.add(new Item(i + 1, nodeinfo[i][0], nodeinfo[i][1]));
}
Collections.sort(aList, new Comparator<Item>() {
@Override
public int compare(Item i1, Item i2) {
if(i1.y == i2.y){
return Integer.compare(i1.x, i2.x);
}else
return Integer.compare(i2.y, i1.y);
}
});
for(Item item : aList){
tree.addNode(new Node(item.idx, item.x, item.y));
}
tree.pre(tree.root);
tree.post(tree.root);
return answer;
}
}
|
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[2019 카카오 개발자 겨울 인턴십] 튜플(Java, 깊은 복사, 문자열 처리) (0) | 2020.08.29 |
---|---|
[2019 KAKAO BLIND RECRUITMENT] 블록 게임(Java, 간단한 코드) (0) | 2020.08.27 |
[2019 KAKAO BLIND RECRUITMENT] 무지의 먹방 라이브(Java) (0) | 2020.08.27 |
[2020 KAKAO BLIND RECRUITMENT] 기둥과 보 설치(Java, 간단한코드) (0) | 2020.08.25 |
[2020 KAKAO BLIND RECRUITMENT] 가사검색(Trie, Java, 효율성, 간단한 코드) (0) | 2020.08.24 |