algorithm/프로그래머스
[프로그래머스] 길 찾기 게임(09.01)
자바왕세자
2020. 9. 1. 23:42
문제
https://programmers.co.kr/learn/courses/30/lessons/42892
코딩테스트 연습 - 길 찾기 게임
[[5,3],[11,5],[13,3],[3,5],[6,1],[1,3],[8,6],[7,2],[2,2]] [[7,4,6,9,1,8,5,2,3],[9,6,5,8,1,4,3,2,7]]
programmers.co.kr
접근법
문제 그대로 그래프를 구현해서 풀었다.
그래프 클래스를 만들어서 삽입하는 로직을 만들어주는것이 포인트였다.
우선 y좌표 값이 높고 x좌표 값이 낮은 순으로 정렬했다.
그렇게 되면 그래프에 삽입이 되는 순서가 완성이 된다.
그 후 root 객체를 전역변수로 빼고 root를 타고 내려가면서 알맞은 위치에 삽입했다.
코드
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class Solution {
public Node root;
public class Node{
private Pair data;
private Node left;
private Node right;
public Node(Pair data){
this.data = data;
this.left = null;
this.right = null;
}
public void add(Pair data){
Node node = new Node(data);
if(root == null){
root = node;
return;
}
Node current = root;
while(true){
Node parent = current;
if(data.x < current.data.x){
current = current.left;
if(current == null){
parent.left = node;
return;
}
}else{
current = current.right;
if(current == null){
parent.right = node;
return;
}
}
}
}
}
public class Pair implements Comparable<Pair>{
int x;
int y;
int num;
public Pair(int x, int y, int num) {
this.x = x;
this.y = y;
this.num = num;
}
@Override
public int compareTo(Pair o) {
if(this.y < o.y)
return 1;
else if(this.y > o.y)
return -1;
else{
if(this.x < o.x)
return -1;
else if(this.x > o.x)
return 1;
return 0;
}
}
}
public int[][] solution(int[][] nodeinfo) {
int[][] answer = new int[2][nodeinfo.length];
List<Pair> list = new ArrayList<>();
for(int i=0;i<nodeinfo.length;i++){
list.add(new Pair(nodeinfo[i][0], nodeinfo[i][1], i+1));
}
Collections.sort(list);
for(int i=0; i<list.size();i++){
if(i==0){
root = new Node(list.get(i));
continue;
}
root.add(list.get(i));
}
List<Integer> preOrderList = new ArrayList<>();
List<Integer> postOrderList = new ArrayList<>();
preOrder(root, preOrderList);
postOrder(root, postOrderList);
for(int i=0;i<nodeinfo.length;i++){
answer[0][i] = preOrderList.get(i);
answer[1][i] = postOrderList.get(i);
}
return answer;
}
private void preOrder(Node node, List<Integer> list){
if(node == null)
return;
list.add(node.data.num);
preOrder(node.left, list);
preOrder(node.right, list);
}
private void postOrder(Node node, List<Integer> list){
if(node == null)
return;
postOrder(node.left, list);
postOrder(node.right, list);
list.add(node.data.num);
}
}