문제 링크 : https://www.acmicpc.net/problem/2250
이 문제는, 트리의 모양이 주어지는데 이것을 "격자에 그리는 것" 에 대한 문제 입니다.
예제의 그림을 잘 보면, 주어진 트리를 중위순회 한 순서가 격자의 가로의 인덱스임을 알 수 있습니다. 따라서 다음과 같은 문제 해결 전략을 세웠습니다.
1. 트리를 만든다
2. 중위순회로 가장 왼쪽(1)부터 값을 넣는다. 값은 pair로 {레벨, index++} 로 벡터에 넣는다.
3. 벡터를 sort한다. pair로 정렬했기때문에 레벨별 -> 그 중에 인덱스별로 정렬이 된다.
4. 각 레벨당 최대인덱스 - 최소인덱스 + 1 을 구해본다.
5. 값을 출력한다.
소스코드 :
이 문제는, 트리의 모양이 주어지는데 이것을 "격자에 그리는 것" 에 대한 문제 입니다.
예제의 그림을 잘 보면, 주어진 트리를 중위순회 한 순서가 격자의 가로의 인덱스임을 알 수 있습니다. 따라서 다음과 같은 문제 해결 전략을 세웠습니다.
1. 트리를 만든다
2. 중위순회로 가장 왼쪽(1)부터 값을 넣는다. 값은 pair로 {레벨, index++} 로 벡터에 넣는다.
3. 벡터를 sort한다. pair로 정렬했기때문에 레벨별 -> 그 중에 인덱스별로 정렬이 된다.
4. 각 레벨당 최대인덱스 - 최소인덱스 + 1 을 구해본다.
5. 값을 출력한다.
소스코드 :
| 
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 | 
// [BOJ] 백준 2250 트리의 높이와 너비 
#include <iostream> 
#include <vector> 
#include <algorithm> 
using namespace std; 
int index = 1; 
vector<pair<int, int> > vec; 
class Node { 
public:     
    int data; 
    Node* left; 
    Node* right; 
}; 
// 중위순회 
void InOrder(Node* node, int height) { 
    if (node == NULL) 
        return; 
    InOrder(node->left, height+1); 
    vec.push_back({ height, index++ }); 
    InOrder(node->right,height+1); 
} 
int main() { 
    int n; 
    cin >> n; 
    // 1. 트리를 만든다 
    vector<Node*> v(n + 1); 
    for (int i = 1; i <= n; i++) { 
        Node *tmp = new Node; 
        tmp->data = i; 
        tmp->left = NULL; 
        tmp->right = NULL; 
        v[i] = tmp; 
    } 
    bool flag = false; 
    int root = 1; 
    for (int i = 1; i <= n; i++) { 
        cin.ignore(); 
        int a, b, c; 
        cin >> a >> b >> c; 
        if (!flag) { 
            flag = true; 
            root = a; 
        } 
        else { 
            if (b == root || c == root) { 
                root = a; 
            } 
        } 
        if (b != -1) 
            v[a]->left = v[b]; 
        if (c != -1) 
            v[a]->right = v[c]; 
    } 
    // 2, 중위순회 
    InOrder(v[root],1); 
    // 3, 벡터를 정렬한다. 
    sort(vec.begin(), vec.end()); 
    pair<int, int> large; 
    large.first = 1; 
    large.second = 0; 
    int maxLevel = vec[vec.size() - 1].first; 
    vector<vector<int> > num(maxLevel+1); 
    // 4. 각 레벨당 최대인덱스 -최소인덱스 +1을구한다. 
    for (int i = 1; i <= maxLevel; i++) { 
        for (int j = 0; j < vec.size(); j++) { 
            if (vec[j].first > i) { 
                break; 
            } 
            if (i == vec[j].first) { 
                num[i].push_back(vec[j].second); 
            } 
        } 
        if(!num[i].empty()) 
            if (large.second < num[i].back() - num[i].front() + 1) { 
                large.second = num[i].back() - num[i].front() + 1; 
                large.first = i; 
            } 
    } 
    // 5. 값 출력 
    std::cout << large.first << ' ' << large.second; 
} | cs | 
댓글
댓글 쓰기