๐ ๋ฌธ์ ๋งํฌ
๊ธธ ์ฐพ๊ธฐ ๊ฒ์
์ฝ๋ฉํ
์คํธ ์ฐ์ต - ๊ธธ ์ฐพ๊ธฐ ๊ฒ์ ๋ฌธ์ ์
๋๋ค.
๐ก ๋ฌธ์ ํ์
- 2์ฐจ์ ์ขํ๋ก ํํ๋ ๋
ธ๋ ์ ๋ณด(
nodeinfo)๊ฐ ์ฃผ์ด์ง๋ฉฐ, ์ด ์ขํ๋ค๋ก ์ด์ง ํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ค. - ๊ตฌ์ฑํ ์ด์ง ํธ๋ฆฌ๋ฅผ ์ ์ ์ํ, ํ์ ์ํํ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ๊ฐ ๋ฐฐ์ด๋ก ๋ฐํํ๋ ๋ฌธ์ ์ด๋ค.
๐๏ธ ์ ๊ทผ ๋ฐฉ๋ฒ
- ์ขํ๋ค์
y์ขํ ๋ด๋ฆผ์ฐจ์์ผ๋ก, y์ขํ๊ฐ ๊ฐ๋ค๋ฉดx์ขํ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ฉด ๋ฃจํธ ๋ ธ๋๋ถํฐ ์ผ์ชฝ ์์, ์ค๋ฅธ์ชฝ ์์ ์์๋ก ์ ๋ ฌ๋๋ค. - ์ ๋ ฌ๋ ์ฒซ ๋ฒ์งธ ๋
ธ๋๋ฅผ ๋ฃจํธ๋ก ์ผ๊ณ , ์ดํ ๋
ธ๋๋ค์ ํ๋์ฉ ํธ๋ฆฌ์ ์ฝ์
ํ๋ค.
- ์ฝ์ ํ ๋ ธ๋์ x์ขํ๊ฐ ๋ถ๋ชจ๋ณด๋ค ์์ผ๋ฉด ์ผ์ชฝ ์๋ธํธ๋ฆฌ๋ก, ํฌ๋ฉด ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ๋ก ์ฌ๊ท์ ์ผ๋ก ๋ด๋ ค๊ฐ๋ฉฐ ์์น๋ฅผ ์ฐพ๋๋ค.
- ํธ๋ฆฌ๊ฐ ๋ชจ๋ ๊ตฌ์ฑ๋๋ฉด ์ ์ ์ํ์ ํ์ ์ํ๋ฅผ ๊ฐ๊ฐ ์ํํด์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.
๐งฉ ์ฝ๋ ๊ตฌํ
import java.util.*;
class Solution {
class Node {
int x;
int y;
int num;
Node left;
Node right;
Node(int x, int y, int num) {
this.x = x;
this.y = y;
this.num = num;
}
}
public int[][] solution(int[][] nodeinfo) {
List<Node> nodes = new ArrayList<>();
for (int i = 0; i < nodeinfo.length; i++) {
nodes.add(new Node(nodeinfo[i][0], nodeinfo[i][1], i + 1));
}
nodes.sort(Comparator.comparingInt((Node n) -> n.y).reversed()
.thenComparingInt(n -> n.x)
);
Node root = nodes.get(0);
for (int i = 1; i < nodes.size(); i++) {
insert(root, nodes.get(i));
}
List<Integer> preorder = new ArrayList<>();
List<Integer> postorder = new ArrayList<>();
preorder(root, preorder);
postorder(root, postorder);
return new int[][] {
preorder.stream().mapToInt(Integer::intValue).toArray(),
postorder.stream().mapToInt(Integer::intValue).toArray()
};
}
private void insert(Node parent, Node child) {
if (child.x < parent.x) {
if (parent.left == null) {
parent.left = child;
} else {
insert(parent.left, child);
}
} else {
if (parent.right == null) {
parent.right = child;
} else {
insert(parent.right, child);
}
}
}
private void preorder(Node node, List<Integer> result) {
if (node == null) return;
result.add(node.num);
preorder(node.left, result);
preorder(node.right, result);
}
private void postorder(Node node, List<Integer> result) {
if (node == null) return;
postorder(node.left, result);
postorder(node.right, result);
result.add(node.num);
}
}