> 문제
2019 카카오 블라인드 채용 문제
문제 : [길 찾기 게임]
###
> 문제풀이
PriorityQueue(우선순위큐)와 Queue를 사용하여 그래프를 그렸다.
그래프 그리는데 시간이 조금 걸렸지만, 그래프를 그린 후 전위,후위는 어렵지 않았다.
소스는 다음과 같다.
package level3;
import java.util.*;
public class Solution_길찾기게임 {
public static void main(String[] args) {
String s = "[[5,3],[11,5],[13,3],[3,5],[6,1],[1,3],[8,6],[7,2],[2,2]]";
s = s.replace("[", "{");
s = s.replace("]", "}");
System.out.println(s);
int[][] nodeinfo = { { 5, 3 }, { 11, 5 }, { 13, 3 }, { 3, 5 }, { 6, 1 }, { 1, 3 }, { 8, 6 }, { 7, 2 },
{ 2, 2 } };
System.out.println(solution(nodeinfo));
}
static class Pos {
int n, x, y, min, max;
Pos left, right;
public Pos(int n, int x, int y) {
this.n = n;
this.x = x;
this.y = y;
}
@Override
public String toString() {
return "[" + n + ":" + x + "," + y + "]";
}
}
static public int[][] solution(int[][] nodeinfo) {
int[][] answer = new int[2][nodeinfo.length];
preorder = new int[nodeinfo.length];
postorder = new int[nodeinfo.length];
Queue<Pos> pq = new PriorityQueue<>(new Comparator<Pos>() {
@Override
public int compare(Pos o1, Pos o2) {
if (o1.y - o2.y < 0)
return 1;
else if (o1.y - o2.y > 0)
return -1;
else {
return o1.x - o2.x;
}
}
});
Queue<Pos> qu = new LinkedList<>(); // Queue는 parent가 될 노드를 임시저장하는 공간으로, child와 연결할 수 있게 하기 위한 리스트입니다.
int x, y;
for (int i = 0; i < nodeinfo.length; i++) {
x = nodeinfo[i][0];
y = nodeinfo[i][1];
pq.add(new Pos(i + 1, x, y));
}
Pos root = pq.poll();
root.min = 0;
root.max = Integer.MAX_VALUE - 1;
qu.add(root);
while (!pq.isEmpty()) {
Pos parent = qu.poll();
if (parent.y != pq.peek().y && pq.peek().x < parent.x && pq.peek().x < parent.x
&& pq.peek().x >= parent.min) {
Pos left = pq.poll();
left.min = parent.min;
left.max = parent.x;
parent.left = left;
qu.add(left);
}
if (pq.isEmpty())
break;
if (parent.y != pq.peek().y && pq.peek().x > parent.x && pq.peek().x <= parent.max
&& pq.peek().x > parent.x) {
Pos right = pq.poll();
right.min = parent.x;
right.max = parent.max;
parent.right = right;
qu.add(right);
}
}
preFuc(root);
answer[0] = preorder;
index = 0;
postFuc(root);
answer[1] = postorder;
return answer;
}
static int[] preorder, postorder;
static int index;
static void preFuc(Pos root) {
preorder[index++] = root.n;
if (root.left != null) {
preFuc(root.left);
}
if (root.right != null) {
preFuc(root.right);
}
}
static void postFuc(Pos root) {
if (root.left != null) {
postFuc(root.left);
}
if (root.right != null) {
postFuc(root.right);
}
postorder[index++] = root.n;
}
}
문제 출처 : Programmers
PREVIOUS[프로그래머스]Level3 - 자물쇠와 열쇠