일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- Hamming weight
- HAVE A GOOD DAY
- amazon
- 모르고리즘
- LeetCode #릿코드 #좋은 하루 되세요 #Have a nice day
- 코로나 싫어요
- SSAFY 10기 화이팅
- DP
- DFS
- SeongSeobDang
- SSAFY 테스트
- SSAFY IM/A
- Have a nice day.
- 우유가옆으로넘어지면아야
- 텐션 업 10기 화이팅
- 우유가 옆으로 넘어지면 아야
- 자료구조
- 수학
- 텐션 업 10기!
- I am Korean
- 아자아자 화이팅
- have a nice day
- 자고 싶다
- 우유아야
- 네트워크
- Java 환경 설정
- SSAFY 화이팅
- BFS
- Have a good day :)
- Today
- Total
Hope Everyone Is Happy
[골드4] 14267. 회사 문화 1 (Java) 본문
[골드4] 14267. 회사 문화 1 (Java)
J 크 2023. 9. 17. 22:20https://www.acmicpc.net/problem/14267
14267번: 회사 문화 1
영선회사에는 매우 좋은 문화가 있는데, 바로 상사가 직속 부하를 칭찬하면 그 부하가 부하의 직속 부하를 연쇄적으로 칭찬하는 내리 칭찬이 있다. 즉, 상사가 한 직속 부하를 칭찬하면 그 부하
www.acmicpc.net
칭찬 말고 인센 주세요~~
※ 문제를 요약하면 아래와 같습니다.
▶ 어떤 회사에 매우 좋은 문화가 있는데 상사가 직속 부하를 칭찬하면 막내까지 내리 칭찬을 계속함
(이 정도면 괴롭힘아닌가?)
▶ 직속 상사와 직속 부하 관계가 그래프 형태로 주어짐
▶ 모든 칭찬에는 칭찬의 정도를 의미하는 수치가 존재
▶ 칭찬을 받은 정보가 주어진 후, 모든 직원이 얼마나 칭찬 받았는지 출력
▶ 1번 직원은 사장님이라 칭찬 해줄 상사가 없음
▶ Input : 첫째줄에 직원 수 n명, 최초 칭찬 횟수 m 입력 ( 직원은 1번부터 n번까지 번호)
둘째줄에는 1번~N번까지 해당 번호의 직원의 직속 상사 번호가 공백을 구준으로 입력
이후 M줄에는 직속 상사로부터 칭찬을 받은 직원 번호, 칭찬의 수치가 주어짐
▶ Output : 1번 부터 N번까지 칭찬을 받은 정도를 출력
◈ Input - 1
5 3
-1 1 2 3 4
2 2
3 4
5 6
◈ Output - 1
0 2 6 6 12
◎ 코드 작성 전, 아래와 같이 솔루션을 정리하였습니다.
▶ 각 직원의 칭찬 정보를 1차원 배열로 저장
▶ 그래프에서 어떤 노드의 다음 레벨에 대한 정보를 인접리스트로 구현
▶ 칭찬 정보가 들어올 때 마다 dfs탐색하여 더하면 무조건 시간 복잡도 2초 초과 ( N과 M은 최대 100000까지 입력)
▶ 각 노드 (직원) 별로 칭찬 값을 미리 들고 있는 다음, DFS에서 다음 레벨 탐색 시 부모 노드의 칭찬 값 추가
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
static int[] narrCompliments;
static ArrayList<Integer>[] arrList;
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bWriter = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(bReader.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
arrList = new ArrayList[N+1];
narrCompliments = new int[N + 1];
// 인접리스트 초기화
for(int i = 0; i <= N; i++) {
arrList[i] = new ArrayList<>();
}
// 직속 상사 입력 받아주고
st = new StringTokenizer(bReader.readLine());
for (int i = 1; i <= N; i++) {
int nSenior = Integer.parseInt(st.nextToken());
// DFS 관계 저장 ( 인접리스트 )
if (nSenior != -1) {
arrList[nSenior].add(i);
}
}
// 칭찬 받은 직원 부터 DFS 탐색 진행 후 해당 칭찬 수 미리 추가
for (int i = 0; i < M; i++) {
st = new StringTokenizer(bReader.readLine());
int nPerson = Integer.parseInt(st.nextToken());
int nCompliment = Integer.parseInt(st.nextToken());
// 미리 더해놓자.
narrCompliments[nPerson] += nCompliment;
}
DFS(1);
for (int i = 1; i <= N; i++)
bWriter.write(narrCompliments[i] + " ");
bWriter.flush();
bWriter.close();
}
public static void DFS(int nIndex) {
// 기저 조건
for(int i = 0; i < arrList[nIndex].size(); i++) {
int nChild = arrList[nIndex].get(i);
// 누적합 고고하자
narrCompliments[nChild] += narrCompliments[nIndex];
// 다음 자식 노드 고고
DFS(nChild);
}
}
}
Good Luck! (피드백 감사합니다!)
'※ 백준 (Baekjoon) > [Java] 문제 풀이 ( Solve the problems)' 카테고리의 다른 글
[실버1] 1697. 숨바꼭질(Java) (0) | 2023.09.19 |
---|---|
[골드3] 2206. 벽 부수고 이동하기(Java) (0) | 2023.09.18 |
[골드5] 7576. 토마토 (Java) (0) | 2023.09.17 |
[실버2] 1260. DFS와 BFS (Java) (0) | 2023.09.17 |
[실버2] 1012. 유기농 배추 (Java) (0) | 2023.09.14 |