ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

    댓글

Designed by Tistory.