문제 설명

Untitled

문제 분석

Untitled

슈도코드

Untitled

구현

public class 게임개발하기_1516 {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(reader.readLine()); //건물의 종류 수
        ArrayList<ArrayList<Integer>> building = new ArrayList<>();
        for (int i = 0; i <= N; i++) {
            building.add(new ArrayList<>());
        }

        int[] indegree = new int[N + 1]; //진입 차수
        int[] selfBuildTime = new int[N + 1]; //자기 자신을 짓는 데 걸리는 시간
        for (int i = 1; i <= N; i++) {
            StringTokenizer tokenizer = new StringTokenizer(reader.readLine());
            selfBuildTime[i] = Integer.parseInt(tokenizer.nextToken());

            while (true) {
                int prev = Integer.parseInt(tokenizer.nextToken());
                if (prev == -1) break;

                building.get(prev).add(i); //인접 리스트 초기화
                indegree[i]++; //진입 차수 초기화
            }
        }

        //위상 정렬
        Queue<Integer> q = new LinkedList<>();
        for (int i = 1; i <= N; i++) {
            if(indegree[i] == 0) {
                q.add(i);
            }
        }

        int[] result = new int[N+1];
        while(!q.isEmpty()) {
            int curNode = q.poll();
            for (int next : building.get(curNode)) {
                indegree[next]--;
                //시간 업데이트
                result[next] = Math.max(result[next], result[curNode] + selfBuildTime[curNode]);
                if(indegree[next] == 0) {
                    q.add(next);
                }
            }
        }

        for (int i = 1; i <= N; i++) {
            System.out.println(result[i] + selfBuildTime[i]);
        }
    }
}