알고리즘/트리
[BOJ 14267] 회사 문화1 (Java, DFS, Tree)
leejinwoo1126
2023. 6. 26. 21:15
반응형
문제 링크
https://www.acmicpc.net/problem/14267
14267번: 회사 문화 1
영선회사에는 매우 좋은 문화가 있는데, 바로 상사가 직속 부하를 칭찬하면 그 부하가 부하의 직속 부하를 연쇄적으로 칭찬하는 내리 칭찬이 있다. 즉, 상사가 한 직속 부하를 칭찬하면 그 부하
www.acmicpc.net
문제 풀이
- 첫째 줄 회사 직원 수 n, 최초의 칭찬 횟수 m (2 ≤ n, m ≤ 100,000)
- 둘째 줄 직원 n명의 직속 상사(=부모 노드)가 주어짐, 최종적으로 1번이 사장(=Root)이다.
- 다음 m줄에는 직속 상사로부터 칭찬을 받은 직원 번호 i, 칭찬의 수치 w가 주어진다. (2 ≤ i ≤ n, 1 ≤ w ≤ 1,000)
최대치 계산할 경우
- 직원 수(n) 1명에 칭찬(m) 100,000번을 칭찬의 수치(w) 1,000으로 했을 때 최대 10^8 이므로 Integer 범위
입력받은 직원의 칭찬 점수를 갱신하고, 순차 조회하면서 이전 노드의 칭찬 점수 누적해서 구하면 됨
시간 복잡도 : O(N)
제출 코드
import java.util.*;
import java.io.*;
public class Main {
static StringBuilder sb = new StringBuilder();
static int N, M, ROOT;
static List<Integer>[] adj;
static int[] PRAISE;
static void input() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
adj = new ArrayList[N + 1];
for(int i = 1; i <= N; i++) adj[i] = new ArrayList<>();
st = new StringTokenizer(br.readLine());
for(int i = 1; i <= N; i++) {
int parent = Integer.parseInt(st.nextToken());
if(i == 1) {
ROOT = i;
continue;
}
adj[parent].add(i);
}
PRAISE = new int[N + 1];
for(int i = 1; i <= M; i++) {
st = new StringTokenizer(br.readLine());
int to = Integer.parseInt(st.nextToken());
int w = Integer.parseInt(st.nextToken());
PRAISE[to] += w;
}
br.close();
}
static void dfs(int node) {
for(int employee : adj[node]) {
PRAISE[employee] += PRAISE[node];
dfs(employee);
}
}
static void pro() {
dfs(ROOT);
for(int i = 1; i <= N; i++) sb.append(PRAISE[i]).append(" ");
System.out.println(sb);
}
public static void main(String[] args) throws Exception {
input();
pro();
}
}
반응형