道を探すゲーム
アルゴリズムの資料は私も自分で解答したことがありますが、他の人との解答の比較を通じて、私が整理したこれらの資料はもっと良いアルゴリズムを学ぶためです.
プログラマー-道を探すゲーム
https://programmers.co.kr/learn/courses/30/lessons/42892
解答:ツリー構造のクラスを生成し、前列、後列の順序を決定します.
import java.util.ArrayList;
import java.util.Arrays;
class Solution {
static class Tree {
int idx, x, y;
Tree left, right;
Tree(int[] node) {
this.x = node[0];
this.y = node[1];
this.idx = node[2];
}
Tree findParend(int x, int y) { // 부모 찾기
Tree tmp = x < this.x ? left : right;
if (tmp == null)
return this;
while (tmp.y > y) {
Tree child = x < tmp.x ? tmp.left : tmp.right;
if (child == null)
break;
else
tmp = child;
}
return tmp;
}
}
static ArrayList<Integer> list = new ArrayList<Integer>();
public int[][] solution(int[][] nodeinfo) {
int[][] idxNode = new int[nodeinfo.length][];
for (int i = 0; i < nodeinfo.length; i++) {
idxNode[i] = new int[] { nodeinfo[i][0], nodeinfo[i][1], i + 1 };
}
Arrays.sort(idxNode, (a,b) -> b[1]-a[1]); // y축으로 내림차순
Tree root = new Tree(idxNode[0]); // y축 기준으로 제일 높은 root
for (int i = 1; i < nodeinfo.length; i++) {// idx 1부터 시작
int [] node = idxNode[i];
Tree parent = root.findParend(node[0], node[1]);
if(node[0] < parent.x) parent.left = new Tree(node);
else parent.right = new Tree(node);
}
PreOrder(root);
int [] pre = new int [nodeinfo.length];
for (int i = 0; i < nodeinfo.length; i++) {
pre[i] = list.get(i);
}
list = new ArrayList<>();
PostOrder(root);
int [] post = new int [nodeinfo.length];
for (int i = 0; i < nodeinfo.length; i++) {
post[i] = list.get(i);
}
int [][] answer = new int [][] {pre, post};
return answer;
}
static void PreOrder(Tree t) { // 전위 순회
list.add(t.idx);
if(t.left != null) PreOrder(t.left);
if(t.right != null) PreOrder(t.right);
}
static void PostOrder(Tree t) { // 후위 순회
if(t.left != null) PostOrder(t.left);
if(t.right != null) PostOrder(t.right);
list.add(t.idx);
}
}
Reference
この問題について(道を探すゲーム), 我々は、より多くの情報をここで見つけました https://velog.io/@jkh2801/프로그래머스-길-찾기-게임テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol