Algorithm/백준(BOJ)
[백준] 14267. 회사 문화 1 (Java)
Carroti
2022. 9. 13. 00:47
🔒 문제
14267번: 회사 문화 1
영선회사에는 매우 좋은 문화가 있는데, 바로 상사가 직속 부하를 칭찬하면 그 부하가 부하의 직속 부하를 연쇄적으로 칭찬하는 내리 칭찬이 있다. 즉, 상사가 한 직속 부하를 칭찬하면 그 부하
www.acmicpc.net
🔑 알고리즘
트리, 그래프, DP
💡 풀이
먼저 문제의 입력이 애매하게 설명되어있는데
한 명의 부하는 한 명의 직속 상사만 가질 수 있지만
한 명의 상사는 여러 명의 직속 부하를 가질 수 있는 트리 구조이다.
출력할 때 1번부터 n번의 직원의 칭찬을 출력하므로, 즉 상사부터 부하 순으로 출력하므로
1번부터 n번의 직원까지,
[자신의 직속 상사가 받은 칭찬의 정도]와 [자신이 직속 상사로부터 받은 칭찬의 정도(입력 값)]를 더해 출력하고 저장하고 있으면 된다.
그러면 자연스레 다시 자신의 직속 부하의 출력 순서가 됐을 때 자신이 가진 칭찬의 정도를 탐색하는 구조가 된다.
자신의 상사 번호를 저장하는 배열과
자신이 받은 칭찬 값을 저장하는 배열 두가지만 사용하면 되는 문제이다.
* 사장의 상사가 -1로 입력되므로 사장의 상사를 찾을 때 배열의 인덱스로 -1이 들어가게 된다.
따라서 사장의 상사 인덱스의 값을 -1에서 0으로 고쳐준다.
✏️ 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int[] bossIndex = new int[n + 1];
int[] arr = new int[n + 1];
st = new StringTokenizer(br.readLine(), " ");
for (int i = 1; i <= n; i++) {
bossIndex[i] = Integer.parseInt(st.nextToken());
}
bossIndex[1] = 0;
for (int i = 0; i < m; i++) {
st = new StringTokenizer(br.readLine(), " ");
int index = Integer.parseInt(st.nextToken());
int w = Integer.parseInt(st.nextToken());
arr[index] += w;
}
for (int i = 1; i <= n; i++) {
arr[i] += arr[bossIndex[i]];
System.out.print(arr[i] + " ");
}
}
}