Algorithm

[Programmers] 길 찾기 게임

프로그래민 2020. 8. 16. 00:27
반응형

이진트리의 순회 문제이다.

이 문제는 이진트리의 노드들이 주어지고 전위순회(루트->좌->우), 후위순회(좌->우->루트)를 구하는 문제였다. 보통의 문제들과 다른점은 간선을 그리는 것이 주요한 문제였다. 따라서 두가지 과정을 거쳐 간선을 그려보았다. 일단 첫번째로 모든 노드들을 y로 내림차순, y가 같다며 x로 오름차순이 되도록 정렬을 하였다. 그 후에 Node라는 클래스를 만들어 left, right를 Node의 형으로 멤버변수(포인터의 개념)를 주고, 정렬된 노드들을 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
package programmers;
 
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;
 
public class Solution_2019카카오_길찾기게임 {
    
    static StringBuilder preOrderResult;
    static StringBuilder postOrderResult;
    
    static class Node implements Comparable<Node>{
        int num,x,y;
        Node left,right;
        Node(int num,int x,int y){
            this.num=num; this.x=x;this.y=y; left=null; right=null;
        }
        @Override
        public int compareTo(Node o) {
            if(y==o.y) {
                return Integer.compare(x, o.x);    //x에 대하여 오름차순
            }
            return -Integer.compare(y, o.y);    //y에 대하여 내림차순
        }
    }
    
    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 [] a : answer) {
            System.out.println(Arrays.toString(a));
        }
    }
    
    static int[][] solution(int[][] nodeinfo){
        int[][] answer=new int[2][nodeinfo.length];
        
        List<Node> nodes= new ArrayList<>();
        
        
        for(int i=0;i<nodeinfo.length;i++) {
            int x= nodeinfo[i][0];
            int y= nodeinfo[i][1];
            nodes.add(new Node(i+1, x, y));
        }
        
        Collections.sort(nodes);
 
        //간선 연결
        for(int i=1;i<nodeinfo.length;i++) {
            Node root = nodes.get(0);
            
            Node cur= nodes.get(i);
            
            while(true) {
                if(cur.x<root.x) {
                    if(root.left==null) {
                        root.left=cur;
                        break;
                    }
                    root=root.left;
                }else if(root.x<cur.x) {
                    if(root.right==null) {
                        root.right=cur;
                        break;
                    }
                    root=root.right;
                }
            }
        }
        
        Node root= nodes.get(0);
        
        StringTokenizer st = null;
        
        preOrderResult=new StringBuilder();
        preOrder(root);
        st =new StringTokenizer(preOrderResult.toString());
        for(int i=0;i<nodeinfo.length;i++) {
            answer[0][i]=Integer.parseInt(st.nextToken());
        }
        
        
        postOrderResult=new StringBuilder();
        postOrder(root);
        st =new StringTokenizer(postOrderResult.toString());
        for(int i=0;i<nodeinfo.length;i++) {
            answer[1][i]=Integer.parseInt(st.nextToken());
        }
        return answer;
    }
    
    static void preOrder(Node root) {
        preOrderResult.append(root.num+" ");
        if(root.left!=null) {
            preOrder(root.left);
        }
        if(root.right!=null) {
            preOrder(root.right);
        }
    }
    
    static void postOrder(Node root) {
        if(root.left!=null) {
            postOrder(root.left);
        }
        if(root.right!=null) {
            postOrder(root.right);
        }
        postOrderResult.append(root.num+" ");
    }
    
}
 
                                   
반응형

'Algorithm' 카테고리의 다른 글

[BOJ] 1992. 쿼드트리  (0) 2020.08.27
[Programmers] 블록 게임  (2) 2020.08.22
[BOJ] 9466. 텀 프로젝트  (4) 2020.08.15
[Programmers] 문자열 압축  (0) 2020.08.12
[BOJ] 2644. 촌수계산  (0) 2020.08.11