[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค / Java] - ๊ธธ ์ฐพ๊ธฐ ๊ฒŒ์ž„

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ

๊ธธ ์ฐพ๊ธฐ ๊ฒŒ์ž„
์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ๊ธธ ์ฐพ๊ธฐ ๊ฒŒ์ž„ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
school.programmers.co.kr

๐Ÿ’ก ๋ฌธ์ œ ํŒŒ์•…

  • 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);
    }
}