길 찾기 게임

태그: , ,

카테고리: ,


출처 프로그래머스 - 길 찾기 게임

사용 언어 자바

문제 설명

노드들을 입력받아 이진트리로 만들어 전위, 후위 순회 결과를 반환

  • 트리를 구성하는 모든 노드의 x, y 좌표 값은 정수이다.
  • 모든 노드는 서로 다른 x값을 가진다.
  • 같은 레벨(level)에 있는 노드는 같은 y 좌표를 가진다.
  • 자식 노드의 y 값은 항상 부모 노드보다 작다.
  • 임의의 노드 V의 왼쪽 서브 트리(left subtree)에 있는 모든 노드의 x값은 V의 x값보다 작다.
  • 임의의 노드 V의 오른쪽 서브 트리(right subtree)에 있는 모든 노드의 x값은 V의 x값보다 크다.

입력 예 : [[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]]

제한사항

  • nodeinfo는 이진트리를 구성하는 각 노드의 좌표가 1번 노드부터 순서대로 들어있는 2차원 배열이다.
  • nodeinfo의 길이는 1 이상 10,000 이하이다.
  • nodeinfo[i] 는 i + 1번 노드의 좌표이며, [x축 좌표, y축 좌표] 순으로 들어있다.
  • 모든 노드의 좌표 값은 0 이상 100,000 이하인 정수이다.
  • 트리의 깊이가 1,000 이하인 경우만 입력으로 주어진다.
  • 모든 노드의 좌표는 문제에 주어진 규칙을 따르며, 잘못된 노드 위치가 주어지는 경우는 없다.

입력

  • x, y 정보를 가진 노드 배열 nodeinfo

혹시나 굉장한 풀이방법이 있지않을까해서 고민하다가 포기했다

제출 답안

import java.util.*;
import java.util.stream.Collectors;

class Solution {
    public int[][] solution(int[][] nodeinfo) {
        List<Node> nodes = new ArrayList<>();
        for (int i = 0; i < nodeinfo.length; i++) {
            nodes.add(new Node(i + 1, nodeinfo[i][0], nodeinfo[i][1]));
        }
        
        nodes.sort(nodes, (a, b) -> b.y - a.y);
        
        List<Integer> pre = new ArrayList<>();
        List<Integer> post = new ArrayList<>();
        order(divide(nodes), pre, post);
        
        return new int[][]{ pre.stream().mapToInt(i->i).toArray(),
                            post.stream().mapToInt(i->i).toArray() };
    }
    
    public void order(Node p, List<Integer> pre, List<Integer> post) {
        pre.add(p.num);
        if (p.left != null) order(p.left, pre, post);
        if (p.right != null) order(p.right, pre, post);
        post.add(p.num);
    }
    
    public Node divide(List<Node> nodes) {
        if (nodes.size() <= 0) return null;
        
        Node parent = nodes.get(0);
        parent.left = divide(nodes.stream()
            .filter(a -> a.x < parent.x).collect(Collectors.toList()));
        parent.right = divide(nodes.stream()
            .filter(a -> a.x > parent.x).collect(Collectors.toList()));
        
        return parent;
    }
}

class Node {
    Node left = null;
    Node right = null;
    int num;
    int x;
    int y;
    
    Node(int num, int x, int y) {
        this.num = num;
        this.x = x;
        this.y = y;
    }
}

댓글남기기