본문 바로가기

ProgramSoliving

백준 : 2250

반응형

https://www.acmicpc.net/problem/2250

 

2250번: 트리의 높이와 너비

첫째 줄에 노드의 개수를 나타내는 정수 N(1 ≤ N ≤ 10,000)이 주어진다. 다음 N개의 줄에는 각 줄마다 노드 번호와 해당 노드의 왼쪽 자식 노드와 오른쪽 자식 노드의 번호가 순서대로 주어진다. 노드들의 번호는 1부터 N까지이며, 자식이 없는 경우에는 자식 노드의 번호에 -1이 주어진다.

www.acmicpc.net

 

트리 구현력과 중위순회를 하면서 cul값을 적절하게 바꾸면 되는 문제다.

연결리스트로 구현하기에는 귀찮은 점이많으므로 3*n 배열을 선언해서 left data 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
 
public class B2250 {
    static int N;
    static int parent[];
    static int[][] map;
    static int cur;
    static class BT {
        int left;
        int data;
        int right;
 
        public BT(int left, int data, int right) {
            this.left = left;
            this.data = data;
            this.right = right;
        }
 
    }
    //find
    static int Find(int x) {
        if(parent[x]==x) {
            return x;
        }
        
        return  Find(parent[x]);
    }
    static int Answerh = 0;
    static int Answer = Integer.MIN_VALUE;
    static BT[] node;
    static int deep = 1;
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        N = Integer.parseInt(br.readLine());
 
        node = new BT[N + 1];
        parent = new int[N+1];
        
        int left = 0;
        int data = 0;
        int right = 0;
        
        for(int n=1;n<=N;n++) {
            parent[n]=n;
        }
        
        for (int n = 1; n <= N; n++) {
            String[] str = br.readLine().split(" ");
            data = Integer.parseInt(str[0]);
            left = Integer.parseInt(str[1]);
            right = Integer.parseInt(str[2]);
            
            //배열로 2진트리를 구현했다 
            node[data] = new BT(left, data, right);
            
            //root노드 찾기위해서 parent 초기화하기
            if(left!=-1) {
                parent[left] = data;
            }
            
            if(right!=-1) {
                parent[right] =data;
            }
        }
        
        map = new int[2][N+1];
        
        //최상위 노드 찾기
        
        int root = Find(1);
        cur = 1;
        for(int n=1;n<=N;n++) {
            map[0][n] = Integer.MAX_VALUE;
            map[1][n] = Integer.MIN_VALUE;
        }
        
        DFS(2,node[root].left);
        map[0][1= Math.min(map[0][1], cur);
        map[1][1= Math.max(map[1][1], cur++);
        DFS(2,node[root].right);
        
        for(int d=1;d<=deep;d++) {
            if(Answer < map[1][d] - map[0][d] +1) {
                Answerh = d;
                Answer = map[1][d] - map[0][d] +1;
            }
        }
        
        System.out.print(Answerh+" "+Answer);
        
    }
 
    public static void DFS(int row, int data) {
        if(data== -1)return;
        deep = Math.max(deep, row);
        DFS(row+1,node[data].left);
        map[0][row] = Math.min(map[0][row], cur);
        map[1][row] = Math.max(map[1][row], cur++);
        DFS(row+1,node[data].right);
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
반응형

'ProgramSoliving' 카테고리의 다른 글

백준 : 5719  (0) 2020.02.25
백준 : 1967  (0) 2020.02.24
백준 : 9019  (0) 2020.02.23
백준 : 9466 (텀 프로젝트)  (0) 2020.02.23
백준 : 1707  (0) 2020.02.22