#유형 : 트리, 자료구조

#난이도 : 프로그래머스 LEVEL 3

#입력을 우선순위큐를 사용하여 Y의 크기순, x는 작은순으로 정렬하면 된다. 우선순위큐를 사용해도 되고, 정렬기준을 통해 정렬을 해도 된다. 그러면 가장 앞에 루트노드가 올것이다. 그다음은 이진트리 조건에 따라 left, right를 정해서 트리를 완성하면 된다. 백준을 주로 풀어와서, 프로그래머스 문제는 좀 출력하기가 어색하다. 따라서 코드가 좀 복잡하게 보일 지라도, 기본 알고리즘은 간단하다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package programmers;
 
import java.util.ArrayList;
import java.util.PriorityQueue;
 
public class root {
    static No root;
    static ArrayList<Integer> re[];
    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 i=0; i<2; i++) {
            for(int j=0; j<nodeinfo.length; j++)
                System.out.print(answer[i][j]+" " );
            System.out.println();
        }
    }
    public static int[][] solution(int[][] nodeinfo) {
        solve(nodeinfo);
        int[][] answer = new int[2][nodeinfo.length];
        for(int i=0; i<2; i++) {
                for(int j=0; j<nodeinfo.length; j++) {
                    answer[i][j] = re[i].get(j);
                }
        }
        return answer;
    }
    public static void solve(int[][] nodeinfo) {
//        int[][] answer = {};
        re = new ArrayList[2];
        for(int i=0; i<2; i++) {
                re[i]= new ArrayList<>();
        }
        PriorityQueue<Node> pq = new PriorityQueue<>();
        for(int i=0; i<nodeinfo.length; i++) {
                pq.add(new Node(nodeinfo[i][0], nodeinfo[i][1], i+1));
        }
        
        Node tmp = pq.poll();
        No newNo = new No(tmp.num, tmp.x);
        root = newNo;
        
        while(!pq.isEmpty()) {
                Node nd = pq.poll();
                No n = new No(nd.num, nd.x);
                
                find(root, n);
        }
        preorder(root);
        postorder(root);
    }
    private static void find(No r, No n) {
        // TODO Auto-generated method stub
        if(r.x > n.x && r.left != null) {
            find(r.left, n);
        }else if(r.x > n.x && r.left == null) {
            r.left = n;
        }else if(r.x < n.x && r.right != null) {
            find(r.right, n);
        }else {
            r.right=n;
        }
        
    }
    
    public static void preorder(No n) {
        if(n == null) {
            return;
        }
//        System.out.println(n.num);
        re[0].add(n.num);
        preorder(n.left);
        preorder(n.right);
    }
    public static void postorder(No n) {
        if(n == null)
            return;
        postorder(n.left);
        postorder(n.right);
        re[1].add(n.num);
    }
    
    public static class No{
        int num;
        int x;
        No left;
        No right;
        public No(int n, int x) {
            this.num=n;
            this.x=x;
            this.left=null;
            this.right=null;
        }
    }
    public static class Node implements Comparable<Node>{
        int x;
        int y;
        int num;
        public Node(int x, int y, int num) {
            this.x=x;
            this.y=y;
            this.num=num;
        }
        @Override
        public int compareTo(Node o) {
            // TODO Auto-generated method stub
            if(this.y < o.y)
                return 1;
            else if(this.y == o.y) {
                if(this.x > o.x)
                    return 1;
                else
                    return -1;
            }
            return -1;
        }
    }
}
 
cs

+ Recent posts