BOJ 14267

내리갈굼

문제출처

문제 해석

  • 모든 직원이 갈굼을 얼마나 당하는지 출력하는 문제입니다.
  • 상사가 직속부하를 갈구면 그 부하의 부하직원들은 모두 갈굼을 받습니다.
  • 갈굼의 정도에 대한 수치가 주어지고 해당 수치만큼 똑같이 갈궈집니다.

설계(5)

  • 각 직원의 상사에 대한 정보가 주어지므로 트리를 만들 수 있습니다.
  • 트리의 최상단(사장)부터 dfs탐색을 하여 O(n)만에 모든 직원들의 갈굼정보를 얻을 수 있습니다.
  • 갈굼의 수치가 주어질 때, 같은 직원이 여러번 갈궈질 경우를 대비해서 W[직원]+=갈굼수치로 나타냅니다.

구현(10)

코드
#include <iostream>
#include <vector>
using namespace std;
#define MAXN 100000

vector<int> children[MAXN];

int N, M;
int W[MAXN];
int ans[MAXN];
void dfs(int cur, int sum) {
	for (auto it = children[cur].begin(); it != children[cur].end(); it++) {
		ans[*it] = sum + W[*it];
		dfs(*it, sum + W[*it]);
	}
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin >> N >> M;
	for (int i = 0; i < N; i++) {
		int idx;
		cin >> idx;
		if (idx == -1) continue;
		idx--;
		children[idx].push_back(i);
	}
	while (M--) {
		int idx, w;
		cin >> idx >> w;
		idx--;
		W[idx] += w;
	}
	dfs(0, 0);
	for (int i = 0; i < N; i++) {
		cout << ans[i] << " ";
	}
	return 0;
}
디버깅
제출결과
  • 40ms

마무리

  • 기본적인 트리 탐색 문제입니다. 한번의 순회로 모든 정보를 얻을 수 있기 때문에 최적화를 할 필요가 없는 문제입니다.