-
Q. 12427 자바 : 회사 문화 1코딩테스트/백준_Java 2023. 4. 19. 15:16
Q. 12427 자바 : 회사 문화 1
문제 : boj.kr/12427
골드 4 난이도의 문제이고, 앞의 트리와 쿼리 문제와 유사하다.
트리형 그래프가 주어지고, 칭찬의 횟수가 주어진다.
이 때 칭찬은 칭찬을 받은 사람과 모든 자식(=칭찬을 받은 사람의 서브트리) 전부 받는다.
문제는 아래와 같이 풀었다.
처음 문제를 봤을 때 칭찬을 받을 때 마다 dfs 순회를 하려 했지만,
시간 초과가 날 것 같고 출제자의 의도도 아닌 것 같아 전부 저장하고 한 번만 순회하는 방식으로 풀었다.
1. 칭찬을 받을 때 마다 int 배열에 해당 정점에 값을 저장한다.
2. 칭찬이 끝난 뒤 부모의 칭찬을 자식에 더하는 방식으로 dfs 순회를 한다.
직원수가 n, 칭찬의 수가 m이고 둘 값은 최대 100,000이다.시간 복잡도를 계산하면,
1. 칭찬 횟수 저장 - O(M)
2. 트리 순회 - O(N) -> 모든 정점을 전부 탐색
3. 출력 - O(N)
따라서 두 식을 더하면 약 O(N + M + N) 정도의 시간복잡도를 가지므로
시간초과는 걱정하지 않아도 된다!
자료형의 최대값은 n * log m이므로 int 범위 내에서 모두 해결할 수 있다.
풀이는 아래와 같다.
import java.io.*; import java.util.*; public class Main { static FastReader scan = new FastReader(); static StringBuilder sb = new StringBuilder(); static int n, m, root; static ArrayList<Integer>[] Tree; static int[] Cnt; static void input() throws IOException { n = scan.nextInt(); m = scan.nextInt(); Tree = new ArrayList[n + 1]; Cnt = new int[n + 1]; for (int i = 1; i<= n; i++) Tree[i] = new ArrayList<>(); scan.nextInt(); for (int i = 2; i <= n; i++) { int v = scan.nextInt(); Tree[v].add(i); } for (int i = 0; i < m; i++) { int v = scan.nextInt(); int cnt = scan.nextInt(); Cnt[v] += cnt; } } static void dfs(int x) { for (int y: Tree[x]) { Cnt[y] += Cnt[x]; dfs(y); } } static void pro() { for (int t: Tree[1]) dfs(t); for (int i = 1; i <= n; i++) sb.append(Cnt[i]).append(' '); System.out.println(sb); } public static void main(String[] args) throws IOException { input(); pro(); } static class FastReader { BufferedReader br; StringTokenizer st; public FastReader() { br = new BufferedReader(new InputStreamReader(System.in)); } public FastReader(String s) throws FileNotFoundException { br = new BufferedReader(new FileReader(new File(s))); } String next() { while (st == null || !st.hasMoreElements()) { try { st = new StringTokenizer(br.readLine()); } catch (IOException e) { e.printStackTrace(); } } return st.nextToken(); } int nextInt() { return Integer.parseInt(next()); } long nextLong() { return Long.parseLong(next()); } double nextDouble() { return Double.parseDouble(next()); } String nextLine() { String str = ""; try { str = br.readLine(); } catch (IOException e) { e.printStackTrace(); } return str; } } }
반응형'코딩테스트 > 백준_Java' 카테고리의 다른 글
Q. 4179 자바 : 불! (0) 2023.04.21 Q. 2660 자바 : 회장 뽑기 (0) 2023.04.20 Q. 15681 자바 : 트리와 쿼리 (0) 2023.04.17 Q. 3584 자바 : 가장 가까운 공통 조상 (0) 2023.04.16 Q. 20364 자바 : 부동산 다툼 (0) 2023.04.15