๊ธฐ๋ก๋ฐฉ

BOJ_1516 : ๊ฒŒ์ž„ ๊ฐœ๋ฐœ ๋ณธ๋ฌธ

CodingTest/Java

BOJ_1516 : ๊ฒŒ์ž„ ๊ฐœ๋ฐœ

Soom_1n 2024. 9. 12. 12:22

๐Ÿ‘‰ ๋ฌธ์ œ๋งํฌ



๐Ÿ”ธ ๋ฌธ์ œ ๋ถ„์„ ๐Ÿ”ธ

  • ์Šคํƒ€ํฌ๋ ˆํ”„ํŠธ ๊ฐ™์€ ๊ฒŒ์ž„์—์„œ ๊ฐ ๊ฑด๋ฌผ์„ ์ง“๋Š”๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œ ์‹œ๊ฐ„์„ ๊ตฌํ•ด๋ณด์ž.
  • N๊ฐœ์˜ ๊ฑด๋ฌผ ๋ณ„ ์ง“๋Š” ์‹œ๊ฐ„๊ณผ ๋จผ์ € ์ง€์–ด์ ธ์•ผ ํ•˜๋Š” ๊ฑด๋ฌผ์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

๐Ÿ”ธ ๋ฌธ์ œ ํ’€์ด ๐Ÿ”ธ

  • ์„ ํ–‰ ๋˜์–ด์•ผ ํ•˜๋Š” ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง€๋ฏ€๋กœ ์œ„์ƒ ์ •๋ ฌ(Topology Sort)์„ ํ™œ์šฉํ•ด ํ’€์ดํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์„ ํ–‰ ๊ฑด๋ฌผ ๊ฑด์„ค ์งํ›„ ํ•ด๋‹น ๊ฑด๋ฌผ์„ ์ง“๋Š”๋ฐ, ์„ ํ–‰ ๊ฑด๋ฌผ์ด ์—ฌ๋Ÿฌ๊ฐœ์ผ ๊ฒฝ์šฐ ์ˆœ์„œ๋ฅผ ์ •ํ•  ์ˆ˜ ์—†๋‹ค.
  • ๋”ฐ๋ผ์„œ ์„ ํ–‰ ๊ฑด๋ฌผ์ด ์ง€์–ด์ง€๋Š” ์‹œ๊ฐ„์˜ ์ตœ๋Œ€๊ฐ’ + ํ˜„์žฌ ๊ฑด๋ฌผ์„ ์ง“๋Š” ์‹œ๊ฐ„์„ ๊ตฌํ•œ๋‹ค.

๐Ÿ”ธ ์ฝ”๋“œ ๐Ÿ”ธ

import java.io.*;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();

        int N = Integer.parseInt(br.readLine());
        int[] d = new int[N + 1];
        int[] time = new int[N + 1];

        ArrayList<Integer>[] adjList = new ArrayList[N + 1];
        for (int i = 1; i <= N; i++) {
            adjList[i] = new ArrayList<>();
        }

        for (int i = 1; i <= N; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            time[i] = a;

            while ((a = Integer.parseInt(st.nextToken())) > -1) {
                adjList[a].add(i);
                d[i]++;
            }
        }

        Queue<Integer> que = new ArrayDeque<>();
        int[] answer = new int[N + 1];

        for (int i = 1; i <= N; i++) {
            if (d[i] == 0) {
                que.offer(i);
                answer[i] = time[i];
            }
        }

        while (!que.isEmpty()) {
            int a = que.poll();
            for (int i : adjList[a]) {
                answer[i] = Math.max(answer[i], answer[a] + time[i]);
                if (--d[i] == 0) {
                    que.offer(i);
                }
            }
        }

        for (int i = 1; i <= N; i++) {
            sb.append(answer[i]).append('\n');
        }

        bw.write(sb.toString());
        bw.flush();
    }
}

๐Ÿ”ธ ์ฝ”๋“œ ํ•ด์„ ๐Ÿ”ธ

  • N๊ฐœ์˜ ๊ฑด๋ฌผ์˜ ์ง€์–ด์ง€๋Š” ์‹œ๊ฐ„์„ time, ์ง„์ž… ์ฐจ์ˆ˜๋ฅผ d ๋ฐฐ์—ด์— ์ €์žฅํ•œ๋‹ค.
  • ์œ„์ƒ ์ •๋ ฌ์„ ์œ„ํ•ด ๊ฐ„์„  ์ •๋ณด๋ฅผ ArrayList ๋ฐฐ์—ด adjList์— ์ €์žฅํ•œ๋‹ค.
  • ํ๋ฅผ ๋งŒ๋“ค๊ณ , ํ˜„์žฌ ์ง„์ž… ์ฐจ์ˆ˜๊ฐ€ 0์ธ ๊ฑด๋ฌผ์˜ ๊ฑด์„ค ์‹œ๊ฐ„์„ ๋ฐ”๋กœ ์ •๋‹ต ๋ฐฐ์—ด answer์— ์ €์žฅํ•˜๊ณ , ๊ฑด๋ฌผ ๋ฒˆํ˜ธ๋Š” ํ์— ๋„ฃ๋Š”๋‹ค.
  • ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๊ณ„์‚ฐ์„ ๋ฐ˜๋ณตํ•œ๋‹ค.
    • ํ์—์„œ ๋‚˜์˜จ ๊ฑด๋ฌผ์˜ ๋‹ค์Œ ๊ฑด์„ค ๊ฑด๋ฌผ์˜ ์‹œ๊ฐ„์„ answer์— ์ €์žฅํ•œ๋‹ค.
    • ์ด๋•Œ, ๊ธฐ์กด ๊ฑด์„ค ์‹œ๊ฐ„๊ณผ ํ˜„์žฌ ๊ฑด๋ฌผ ์งํ›„๋กœ ์ง“๋Š” ๊ฑด์„ค ์‹œ๊ฐ„ ์ค‘ ํฐ ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.
    • ๋งŒ์•ฝ ์ง„์ž… ์ฐจ์ˆ˜๊ฐ€ 0์ด ๋˜์—ˆ๋‹ค๋ฉด ํ์— ๋„ฃ๋Š”๋‹ค.
  • ์ •๋‹ต ๋ฐฐ์—ด์— ์ €์žฅ ๋œ ๊ฑด์„ค ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•œ๋‹ค.

๐Ÿ”ธ end ๐Ÿ”ธ

  • ๋ถ€๋ถ„์ ์ธ ์„ ํ–‰ ์ž‘์—… ์ •๋ณด๊ฐ€ ๋‚˜์™”์œผ๋‹ˆ, ์œ„์ƒ ์ •๋ ฌ์ด ๋ฐ”๋กœ ๋– ์˜ฌ๋ž๋‹ค.
  • ๋‹ค๋งŒ, ์ฒซ ํ’€์ด์—์„œ๋Š” ์ง„์ž… ์ฐจ์ˆ˜๊ฐ€ 0์ด ๋˜์—ˆ์„๋•Œ answer[i]์— ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ–ˆ๋Š”๋ฐ ํ‹€๋ ธ๋‹ค.
  • ๊ฑด๋ฌผ์ด ๋™์‹œ์— ์ง€์–ด์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์„ ํ–‰ ์ž‘์—… ์ค‘ ๋” ์˜ค๋ž˜๊ฑธ๋ฆฌ๋Š” ๊ฐ’์œผ๋กœ ๊ณ„์‚ฐํ•ด์•ผ ํ–ˆ๋‹ค.
728x90