Hello Ocean! ๐ŸŒผ

[๋ฐฑ์ค€/C++] 2250. ํŠธ๋ฆฌ์˜ ๋†’์ด์™€ ๋„ˆ๋น„ ๋ณธ๋ฌธ

Algorithm

[๋ฐฑ์ค€/C++] 2250. ํŠธ๋ฆฌ์˜ ๋†’์ด์™€ ๋„ˆ๋น„

bba_dda 2021. 6. 2. 21:40
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

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

 

์ž…๋ ฅ๋œ ์ด์ง„ํŠธ๋ฆฌ์— ๋Œ€ํ•ด์„œ ๊ฐ ๋…ธ๋“œ์— ๋Œ€ํ•ด ์„ธ๋กœ์œ„์น˜(์—ด)๋ฒˆํ˜ธ๋ฅผ ๋งค๊ฒจ์„œ ๊ฐ€์žฅ ๋„“์€ ๋ ˆ๋ฒจ์„ ์ฐพ๊ณ , ๊ทธ ๋„ˆ๋น„๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

ํ’€์ด

left, rignt๊ฐ’์„ ๊ฐ€์ง„ ๋…ธ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ , ๋…ธ๋“œ๋ฒˆํ˜ธ๊ฐ€ 0~N-1๊นŒ์ง€์ด๊ธฐ ๋•Œ๋ฌธ์— Nํฌ๊ธฐ์˜ ๋…ธ๋“œ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ํŠธ๋ฆฌ๋กœ ์ด์šฉํ–ˆ๋‹ค. 

-> ๋ฃจํŠธ๋ฅผ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์ž…๋ ฅ๋ฐ›์„ ๋•Œ check๋ฐฐ์—ด์— ์ž์‹ ,์™ผ์ชฝ์ž์‹,์˜ค๋ฅธ์ชฝ์ž์‹ ๋ชจ๋‘ +1์„ ํ–ˆ๋‹ค. 

์ž…๋ ฅ์„ ๋‹ค ๋ฐ›์€ ํ›„์— check[root] = 1์ด๊ณ  , root๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋…ธ๋“œ๋Š” 2์ด๋‹ค. ์ด๋ ‡๊ฒŒ ๋ฃจํŠธ๋ฅผ ์ฐพ์•˜๋‹ค. 

 

์ค‘์œ„์ˆœํšŒ : ์™ผ->์ž์‹ ->์˜ค ์ˆœ์œผ๋กœ ๋ฐฉ๋ฌธ 

๋”ฐ๋ผ์„œ ํŠธ๋ฆฌ๋ฅผ ์ค‘์œ„์ˆœํšŒํ•˜์—ฌ 1๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ์ฆ๊ฐ€์‹œํ‚ค๋ฉฐ ์—ด๋ฒˆํ˜ธ๋ฅผ ๋งค๊ฒผ๋‹ค. 

์ด ๋•Œ, level๊ฐ’์„ ์ด์šฉํ•˜์—ฌ min_col[level], max_col[level]์— ๊ฐ๊ฐ ํ•ด๋‹น ๋ ˆ๋ฒจ์˜ ์ตœ์†Œ ์—ด๋ฒˆํ˜ธ, ์ตœ๋Œ€ ์—ด๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ–ˆ๋‹ค.

* ์ด ํƒ์ƒ‰ํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ์ฒ˜์Œ์— BFS๋ž‘ DFS๊ฐœ๋… ์ค‘์—์„œ๋งŒ ํ’€์ด๋ฅผ ์ƒ๊ฐํ•ด์„œ ๊ต‰์žฅํžˆ ๋ง‰๋ง‰ํ–ˆ๋‹ค. ํŠธ๋ฆฌ์˜ ๊ฒฝ์šฐ ์„ธ ๊ฐ€์ง€ ์ˆœํšŒ๋ฐฉ์‹์„ ๋จผ์ € ๊ณ ๋ คํ•ด๋ณด์ž..! 

 

๋งˆ์ง€๋ง‰์—๋Š” min_col[level], max_col[level]๋ฅผ ๋Œ๋ฉด์„œ, max_col[level] - min_col[level] ์˜ ์ฐจ์ด๊ฐ€ ์ตœ์†Œ์ธ level์„ ์ฐพ์•˜๋‹ค. 

์ฝ”๋“œ

#include <iostream>

using namespace std;
int N;

struct Node {
    int left;
    int right;
}Node;

// index 1~10000๊นŒ์ง€ ์ด์šฉํ•  ๊ฒƒ 
struct Node tree[10001];  
int check[10001] = {0,}; // ๋ฃจํŠธ ์ฐพ๊ธฐ ์œ„ํ•จ
int min_col[10001];
int max_col[10001];

int col=1;
void inorderTraverse(int num, int level){ //์ค‘์œ„ ์ˆœํšŒ
    // ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ 
    if (tree[num].left > 0)
        inorderTraverse(tree[num].left, level+1);
    
    //์ค‘๊ฐ„ (์ž์‹ )
    min_col[level] = min(min_col[level], col);
    max_col[level] = max(max_col[level], col);
    col++;

    //์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ 
    if (tree[num].right > 0)
        inorderTraverse(tree[num].right, level+1);
}
int main(void){
    // input ์ฒ˜๋ฆฌ
    cin >> N;
    for (int i=0;i<N;i++){
        int num, left, right;
        cin >> num >> left >> right;
        level[num]++;
        if (left != -1)
            level[left]++;
        if (right != -1)
            level[right]++;
        tree[num].left = left;
        tree[num].right = right;
    }
    //๋ฃจํŠธ ์ฐพ๊ธฐ 
    int root;
    for (int i=1;i<=N;i++) {
        if (check[i] == 1)
            root = i;
    }

    fill(&min_col[0], &min_col[10001], 987654321); ///////
    fill(&max_col[0], &max_col[10001], 0);
    // ์ค‘์œ„ ์ˆœํšŒ (์—ด ๋ฒˆํ˜ธ ๋งค๊ธฐ๊ธฐ)
    inorderTraverse(root, 1);

    //์ตœ๋Œ€ ๋„ˆ๋น„์™€ ํ•ด๋‹น ๋ ˆ๋ฒจ ์ฐพ๊ธฐ 
    int result_level = 1;
    int result_width = max_col[1] - min_col[1] + 1; //// +1
    for (int i=2;i<=N;i++){
        int width = max_col[i] - min_col[i] + 1;
        if (result_width < width){
            result_level = i;
            result_width = width;
        }
    }
    cout << result_level << " " << result_width<< endl;
    return 0;
}

๊ฒฐ๊ณผ 

 

์ฐธ๊ณ  

https://jaimemin.tistory.com/713

๋ฐ˜์‘ํ˜•