[C++]백준14267번 회사문화 1

1 minute read

문제는 다음과 같다.

오늘은 백준14267번 회사문화 1 문제를 풀어보도록 하자. 처음에 문제이해를 못했다. 그 후 문제이해를 하고도 쌩dfs를 돌려 TLE를 받았다. 어찌보면 당연한 수순이였다. 데이터 값이 10만개니까.. 사원 수 n이 주어져있고 -1 1 2 3 4가 들어왔을 때의 예제밖에 없어서 직속후배는 한 명인줄 알았다.

따라서 상사의 번호를 저장하는 배열 person을 만들어주고 칭찬의 정도를 저장하는 배열 compliment를 만들어주었다. 그 후 for문을 돌리는데 칭찬의 정도를 누적합하면서 계산해주었다.

예시를 보자. 만일 -1 1 1 3 4 4가 들어왔고 3 4, 4 4, 5 5 라는 칭찬이 들어왔다고 하자.

그럼 person배열에는 0 -1 1 1 3 4 4가 저장되어 있고, compliment에는 0 0 0 4 4 5 0이 저장되어 있을 것이다. for문을 1~n까지 돌리는데 person[1] = -1이므로 0을 출력한다.

그 후 person[2] = 1이므로 compliment[2] += compliment[1]을 해주고 compliment[2]를 출력해준다. 이런 식으로 상사의 칭찬을 누적합하면서 상사의 누적칭찬에 본인의 칭찬 값을 더한 것을 갱신하고 출력만 해주면 된다.

                                     [코드]
#include <iostream>
using namespace std;

int person[100001];
int compliment[100001];
int n, m, num, y, x;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);

	cin >> n >> m;

	for (int i = 1; i <= n; i++) {
		cin >> num;
		if (i == 1) {
			person[1] = -1;
			continue;
		}
		person[i] = num;
	}
	for (int i = 1; i <= m; i++) {
		cin >> y >> x;
		compliment[y] += x;
	}
	for (int i = 1; i <= n; i++) {
		if (i == 1) {
			cout << 0 << ' ';
			continue;
		}
		compliment[i] += compliment[person[i]];
		cout << compliment[i] << ' ';
	}
}