CodingTest/99클럽2024스터디

99클럽 코테 스터디 12일차 TIL, 백준 / 뉴스 전하기

mrawesome 2024. 8. 3. 10:46

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

 

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <thread>
#include <vector>
#include <string>
#include <cstring>
#include <set>
#include <queue>
#include <math.h>
#include <stack>
#include <algorithm>
#include <unordered_map>

#define endl "\n"
#define INT_MAX int(1e9)
#define MAX 10001

using namespace std;
/*
     0               0
   1  2             2 (자식 개수)
      3 4           3(자기 제외 같은 트리내 다른 애들 개수 ?)

     0  5
    1   4
    2   3
    3   2
    4   1

                                0                                               // 0
                1                                 2                            // 2
    3         4           5               6           7                      // 4
  8  9    10 11    12   13      14        15      16                // 6 ?
  17                  18    19     20                21 22 23
*/

int N;
vector<int> minTime;
unordered_map<int, vector<int>> tree;

// 1) 자기의 자식 노드들까지 가장 전파하는 데 가장 오래 걸리는 녀석부터 전파해야 한다. (Greedy)
// 2) 그러면 각 노드들에게, 너를 포함해서, 노드들까지 다 전파하는데 얼마나 걸려 ? 를 계산해야 한다.
//     이때, 리프 노드라면 걸리는 시간 1. 아니라면 자식 노드들 중 뉴스 전파하는데 걸리는 총 시간 높은 순부터 전파.
// 3) 그리고, 가장 많은 녀석을 선택해가는 과정이라고 생각하면 된다.
int dfs(int n)
{
    // 자식 노드들 각각 총 전파시간 모아서 정렬하기 위함
    vector<int> v;

    int ret = 0;
    int w = tree[n].size() - 1;

    for (int child : tree[n])
    {
		v.push_back(dfs(child));
	}

    sort(v.begin(), v.end(), greater<int>());   // 내림차순 정렬

    for (int i = 0; i < v.size(); i++)
    {
        ret = max(ret, v[i] + i);   
        // i 를 더하는 이유 ? ex) 1번째 idx 에 전파할 때는, 앞에 0 번째 노드에 전파하고 나서 + 1 이 
        // 더 걸리기 때문이다.
    }

    return ret + 1; // 자기 자신에게 전파시간 + 1 (리프 노드는 1 리턴)
}

void Input()
{
    cin >> N;

    for (int i = 0; i < N; i++)
    {
		int a;
		cin >> a;
		tree[a].push_back(i);
	}
};

void Solve()
{
    	cout << dfs(0) - 1 << endl;
}

int main() {
    ios::sync_with_stdio(false);

    cin.tie(NULL);
    cout.tie(NULL);

    // freopen("input_c.txt", "r", stdin);

    Input();

    Solve();
    
    return 0;
}