์•Œ๊ณ ๋ฆฌ์ฆ˜/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

[ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค / Programmers Level 3 ] ๊ธธ ์ฐพ๊ธฐ ๊ฒŒ์ž„ ( JAVA / ์ž๋ฐ” )

KIMHYEYUN 2021. 10. 7. 16:04
๋ฐ˜์‘ํ˜•

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

 

๋ฌธ์ œ


์ „๋ฌด๋กœ ์Šน์ง„ํ•œ ๋ผ์ด์–ธ์€ ๊ธฐ๋ถ„์ด ๋„ˆ๋ฌด ์ข‹์•„ ํ”„๋ Œ์ฆˆ๋ฅผ ์ด๋Œ๊ณ  ํŠน๋ณ„ ํœด๊ฐ€๋ฅผ ๊ฐ€๊ธฐ๋กœ ํ–ˆ๋‹ค. 
๋‚ด์นœ๊น€์— ์—ฌํ–‰ ๊ณ„ํš๊นŒ์ง€ ๊ตฌ์ƒํ•˜๋˜ ๋ผ์ด์–ธ์€ ์žฌ๋ฏธ์žˆ๋Š” ๊ฒŒ์ž„์„ ์ƒ๊ฐํ•ด๋ƒˆ๊ณ  ์—ญ์‹œ ์ „๋ฌด๋กœ ์Šน์ง„ํ• ๋งŒํ•œ ์ธ์žฌ๋ผ๊ณ  ์Šค์Šค๋กœ์—๊ฒŒ ๊ฐํƒ„ํ–ˆ๋‹ค.

๋ผ์ด์–ธ์ด ๊ตฌ์ƒํ•œ(๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ ๋ผ์ด์–ธ๋งŒ ์ฆ๊ฑฐ์šธ๋งŒํ•œ) ๊ฒŒ์ž„์€, ์นด์นด์˜ค ํ”„๋ Œ์ฆˆ๋ฅผ ๋‘ ํŒ€์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ๊ฐ ํŒ€์ด ๊ฐ™์€ ๊ณณ์„ ๋‹ค๋ฅธ ์ˆœ์„œ๋กœ ๋ฐฉ๋ฌธํ•˜๋„๋ก ํ•ด์„œ ๋จผ์ € ์ˆœํšŒ๋ฅผ ๋งˆ์นœ ํŒ€์ด ์Šน๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

๊ทธ๋ƒฅ ์ง€๋„๋ฅผ ์ฃผ๊ณ  ๊ฒŒ์ž„์„ ์‹œ์ž‘ํ•˜๋ฉด ์žฌ๋ฏธ๊ฐ€ ๋œํ•ด์ง€๋ฏ€๋กœ, ๋ผ์ด์–ธ์€ ๋ฐฉ๋ฌธํ•  ๊ณณ์˜ 2์ฐจ์› ์ขŒํ‘œ ๊ฐ’์„ ๊ตฌํ•˜๊ณ  ๊ฐ ์žฅ์†Œ๋ฅผ ์ด์ง„ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ๊ฐ€ ๋˜๋„๋ก ๊ตฌ์„ฑํ•œ ํ›„, ์ˆœํšŒ ๋ฐฉ๋ฒ•์„ ํžŒํŠธ๋กœ ์ฃผ์–ด ๊ฐ ํŒ€์ด ์Šค์Šค๋กœ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋„๋ก ํ•  ๊ณ„ํš์ด๋‹ค. 

๋ผ์ด์–ธ์€ ์•„๋ž˜์™€ ๊ฐ™์€ ํŠน๋ณ„ํ•œ ๊ทœ์น™์œผ๋กœ ํŠธ๋ฆฌ ๋…ธ๋“œ๋“ค์„ ๊ตฌ์„ฑํ•œ๋‹ค.

  • ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ชจ๋“  ๋…ธ๋“œ์˜ x, y ์ขŒํ‘œ ๊ฐ’์€ ์ •์ˆ˜์ด๋‹ค.
  • ๋ชจ๋“  ๋…ธ๋“œ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ x๊ฐ’์„ ๊ฐ€์ง„๋‹ค.
  • ๊ฐ™์€ ๋ ˆ๋ฒจ(level)์— ์žˆ๋Š” ๋…ธ๋“œ๋Š” ๊ฐ™์€ y ์ขŒํ‘œ๋ฅผ ๊ฐ€์ง„๋‹ค.
  • ์ž์‹ ๋…ธ๋“œ์˜ y ๊ฐ’์€ ํ•ญ์ƒ ๋ถ€๋ชจ ๋…ธ๋“œ๋ณด๋‹ค ์ž‘๋‹ค.
  • ์ž„์˜์˜ ๋…ธ๋“œ V์˜ ์™ผ์ชฝ ์„œ๋ธŒ ํŠธ๋ฆฌ(left subtree)์— ์žˆ๋Š” ๋ชจ๋“  ๋…ธ๋“œ์˜ x๊ฐ’์€ V์˜ x๊ฐ’๋ณด๋‹ค ์ž‘๋‹ค.
  • ์ž„์˜์˜ ๋…ธ๋“œ V์˜ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒ ํŠธ๋ฆฌ(right subtree)์— ์žˆ๋Š” ๋ชจ๋“  ๋…ธ๋“œ์˜ x๊ฐ’์€ V์˜ x๊ฐ’๋ณด๋‹ค ํฌ๋‹ค.

์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ํ™•์ธํ•ด๋ณด์ž.

๋ผ์ด์–ธ์˜ ๊ทœ์น™์— ๋งž๊ฒŒ ์ด์ง„ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ๋งŒ ์ขŒํ‘œ ํ‰๋ฉด์— ๊ทธ๋ฆฌ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. (์ด์ง„ํŠธ๋ฆฌ์˜ ๊ฐ ๋…ธ๋“œ์—๋Š” 1๋ถ€ํ„ฐ N๊นŒ์ง€ ์ˆœ์„œ๋Œ€๋กœ ๋ฒˆํ˜ธ๊ฐ€ ๋ถ™์–ด์žˆ๋‹ค.)

์ด์ œ, ๋…ธ๋“œ๋ฅผ ์ž‡๋Š” ๊ฐ„์„ (edge)์„ ๋ชจ๋‘ ๊ทธ๋ฆฌ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๋ชจ์–‘์ด ๋œ๋‹ค.

์œ„ ์ด์ง„ํŠธ๋ฆฌ์—์„œ ์ „์œ„ ์ˆœํšŒ(preorder), ํ›„์œ„ ์ˆœํšŒ(postorder)๋ฅผ ํ•œ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๊ณ , ์ด๊ฒƒ์€ ๊ฐ ํŒ€์ด ๋ฐฉ๋ฌธํ•ด์•ผ ํ•  ์ˆœ์„œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

  • ์ „์œ„ ์ˆœํšŒ : 7, 4, 6, 9, 1, 8, 5, 2, 3
  • ํ›„์œ„ ์ˆœํšŒ : 9, 6, 5, 8, 1, 4, 3, 2, 7

๋‹คํ–‰ํžˆ ๋‘ ํŒ€ ๋ชจ๋‘ ๋จธ๋ฆฌ๋ฅผ ๋ชจ์•„ ๋ถ„์„ํ•œ ๋์— ๋ผ์ด์–ธ์˜ ์˜๋„๋ฅผ ๊ฐ„์‹ ํžˆ ์•Œ์•„์ฐจ๋ ธ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์—ฌ์ „ํžˆ ๋ฌธ์ œ๋Š” ๋‚จ์•„์žˆ๋‹ค. ๋…ธ๋“œ์˜ ์ˆ˜๊ฐ€ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ์ ๋‹ค๋ฉด ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ, ์˜ˆ์ƒ๋Œ€๋กœ ๋ผ์ด์–ธ์€ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ƒ๊ฐ์ด ์ „ํ˜€ ์—†์—ˆ๋‹ค. 

์ด์ œ ๋‹น์‹ ์ด ๋‚˜์„ค ๋•Œ๊ฐ€ ๋˜์—ˆ๋‹ค. 

๊ณค๊ฒฝ์— ๋น ์ง„ ์นด์นด์˜ค ํ”„๋ Œ์ฆˆ๋ฅผ ์œ„ํ•ด ์ด์ง„ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋…ธ๋“œ๋“ค์˜ ์ขŒํ‘œ๊ฐ€ ๋‹ด๊ธด ๋ฐฐ์—ด nodeinfo๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, 
๋…ธ๋“œ๋“ค๋กœ ๊ตฌ์„ฑ๋œ ์ด์ง„ํŠธ๋ฆฌ๋ฅผ ์ „์œ„ ์ˆœํšŒ, ํ›„์œ„ ์ˆœํšŒํ•œ ๊ฒฐ๊ณผ๋ฅผ 2์ฐจ์› ๋ฐฐ์—ด์— ์ˆœ์„œ๋Œ€๋กœ ๋‹ด์•„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•˜์ž.

์ œํ•œ ์‚ฌํ•ญ


  • nodeinfo๋Š” ์ด์ง„ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐ ๋…ธ๋“œ์˜ ์ขŒํ‘œ๊ฐ€ 1๋ฒˆ ๋…ธ๋“œ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ๋“ค์–ด์žˆ๋Š” 2์ฐจ์› ๋ฐฐ์—ด์ด๋‹ค.
    • nodeinfo์˜ ๊ธธ์ด๋Š” 1 ์ด์ƒ 10,000 ์ดํ•˜์ด๋‹ค.
    • nodeinfo[i] ๋Š” i + 1๋ฒˆ ๋…ธ๋“œ์˜ ์ขŒํ‘œ์ด๋ฉฐ, [x์ถ• ์ขŒํ‘œ, y์ถ• ์ขŒํ‘œ] ์ˆœ์œผ๋กœ ๋“ค์–ด์žˆ๋‹ค.
    • ๋ชจ๋“  ๋…ธ๋“œ์˜ ์ขŒํ‘œ ๊ฐ’์€ 0 ์ด์ƒ 100,000 ์ดํ•˜์ธ ์ •์ˆ˜์ด๋‹ค.
    • ํŠธ๋ฆฌ์˜ ๊นŠ์ด๊ฐ€ 1,000 ์ดํ•˜์ธ ๊ฒฝ์šฐ๋งŒ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค.
    • ๋ชจ๋“  ๋…ธ๋“œ์˜ ์ขŒํ‘œ๋Š” ๋ฌธ์ œ์— ์ฃผ์–ด์ง„ ๊ทœ์น™์„ ๋”ฐ๋ฅด๋ฉฐ, ์ž˜๋ชป๋œ ๋…ธ๋“œ ์œ„์น˜๊ฐ€ ์ฃผ์–ด์ง€๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค.

ํ’€์ด


Tree ๋ฅผ ๋งŒ๋“ค์–ด์„œ ํ•ด๊ฒฐ!

 

1๏ธโƒฃ ๋…ธ๋“œ๋“ค์„ y์ขŒํ‘œ๊ฐ€ ํฐ ์ˆœ์œผ๋กœ ์ •๋ ฌ

2๏ธโƒฃ ๊ฐ€์žฅ ํฐ ๋…ธ๋“œ๋ฅผ root๋กœ ์„ ํƒ โ€ผ๏ธ

3๏ธโƒฃ ์ •๋ ฌ๋œ ์ˆœ์œผ๋กœ ์ž์‹ ๋…ธ๋“œ๋กœ ์ถ”๊ฐ€

    ๐Ÿ‘‰ ๋ถ€๋ชจ๋ณด๋‹ค x ์ขŒํ‘œ๊ฐ€ ์ž‘์œผ๋ฉด left

    ๐Ÿ‘‰ ๋ถ€๋ชจ๋ณด๋‹ค x ์ขŒํ‘œ๊ฐ€ ํฌ๋ฉด right

๐Ÿ™Œ Tree ์™„์„ฑ ๐Ÿ™Œ

 

PreOrder , PostOrder ์ง„ํ–‰ 

์ฝ”๋“œ


import java.util.ArrayList;
import java.util.Collections;

public class ๊ธธ์ฐพ๊ธฐ๊ฒŒ์ž„{
    
    public static class node implements Comparable<node>{
        int x;
        int y;
        int data;
        node left;
        node right;

        node(int x, int y, int data){
            this.x = x;
            this.y = y;
            this.data = data;
        }

        @Override
        public int compareTo(node o) {
            return o.y - this.y;
        }
    }

    static ArrayList<node> nodeList;
    static int[][] answer;
    static int idx;

    public static int[][] solution(int[][] nodeinfo) {
        answer = new int[2][nodeinfo.length];

        nodeList = new ArrayList<>();
        for(int i = 0 ; i < nodeinfo.length; i++){
            nodeList.add(new node(nodeinfo[i][0], nodeinfo[i][1], i+1));
        }
        Collections.sort(nodeList);

        node root = nodeList.get(0);

        for(int i = 1; i < nodeList.size() ; i++){
            makeTree(root, nodeList.get(i));
        }

        idx = 0;
        preOrder(root);
        idx = 0;
        postOrder(root);

        return answer;
    }

    private static void postOrder(node root) {
        if(root != null){
            postOrder(root.left);
            postOrder(root.right);
            answer[1][idx++] = root.data;
        }
    }

    private static void preOrder(node root) {
        if(root != null){
            answer[0][idx++] = root.data;
            preOrder(root.left);
            preOrder(root.right);
        }

    }

    private static void makeTree(node root, node child) {
        if(child.x < root.x){
            if(root.left == null)
                root.left = child;
            else
                makeTree(root.left, child);
        }
        else{
            if(root.right == null)
                root.right = child;
            else
                makeTree(root.right, child);
        }
    }
    public static void main(String[] args) {
        int[][] nodeinfo = {{5,3},{11,5},{13,3},{3,5},{6,1},{1,3},{8,6},{7,2},{2,2}};
        int[][] answer = solution(nodeinfo);

        for(int[] ans : answer){
            for(int a : ans){
                System.out.print(a +" ");
            }
            System.out.println();
        }
    }
}

 

728x90
๋ฐ˜์‘ํ˜•