๊ธฐ๋ก๋ฐฉ

BOJ_1005 : ACM Craft ๋ณธ๋ฌธ

CodingTest/Java

BOJ_1005 : ACM Craft

Soom_1n 2024. 4. 4. 01:50

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

 

1005๋ฒˆ: ACM Craft

์ฒซ์งธ ์ค„์—๋Š” ํ…Œ์ŠคํŠธ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜ T๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฃผ์–ด์ง„๋‹ค. ์ฒซ์งธ ์ค„์— ๊ฑด๋ฌผ์˜ ๊ฐœ์ˆ˜ N๊ณผ ๊ฑด๋ฌผ๊ฐ„์˜ ๊ฑด์„ค์ˆœ์„œ ๊ทœ์น™์˜ ์ด ๊ฐœ์ˆ˜ K์ด ์ฃผ์–ด์ง„๋‹ค. (๊ฑด๋ฌผ์˜ ๋ฒˆํ˜ธ๋Š” 1๋ฒˆ๋ถ€

www.acmicpc.net


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

  • ์•ž์„  ๊ฑด๋ฌผ๋“ค์ด ๋ชจ๋‘ ์ง€์–ด์ ธ์•ผ ํ•ด๋‹น ๊ฑด๋ฌผ์„ ์ง€์„ ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฑด๋ฌผ ์ˆœ์„œ ๊ทœ์น™์ด ์กด์žฌํ•œ๋‹ค.
  • ๊ฑด๋ฌผ์€ ๋™์‹œ์— ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ์ง€์„ ์ˆ˜ ์žˆ๋‹ค.
  • ๋ชฉํ‘œ ๊ฑด๋ฌผ์„ ์ง“๋Š”๋ฐ ๋“œ๋Š” ์ตœ์†Œ ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•œ๋‹ค.

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

  1. ๊ฑด๋ฌผ์ด ์ง€์–ด์ง€๋Š” ์ˆœ์„œ๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋Š”๋ฐ ์„ ํ–‰ ์ž‘์—…์ด ์กด์žฌํ•˜๋ฏ€๋กœ, ์œ„์ƒ ์ •๋ ฌ์„ ์‚ฌ์šฉํ•ด์„œ ํ’€์ดํ•œ๋‹ค.
  2. ๋™์‹œ์— ๊ฑด๋ฌผ์„ ์ง€์—ˆ๋‹ค๊ณ  ํ•  ๋•Œ, ๊ฐ€์žฅ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ๊ฑด์„ค ์‹œ๊ฐ„์ด ์ตœ์†Œ๊ฐ’์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ตœ๋Œ€๊ฐ’์„ ๊ฐฑ์‹ ํ•ด์„œ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด DP๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    1. ์ ํ™”์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.  [ํ˜„์žฌ ๊ฑด๋ฌผ์˜ ์ตœ๋Œ€ ๊ฑด์„ค ์‹œ๊ฐ„] = max([์ด์ „ ๊ฑด๋ฌผ์˜ ์ตœ๋Œ€ ๊ฑด์„ค ์‹œ๊ฐ„ + ํ˜„์žฌ ๊ฑด๋ฌผ ๊ฑด์„ค ์‹œ๊ฐ„], [ํ˜„์žฌ ๊ฑด๋ฌผ์˜ ์ตœ๋Œ€ ๊ฑด์„ค ์‹œ๊ฐ„]) 
  3. ์œ„์ƒ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋™์ž‘ ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
    1. ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ธ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํ์— ๋„ฃ๋Š”๋‹ค.
    2. ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋‹ค์Œ์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.
      • ํ์—์„œ ์›์†Œ๋ฅผ ๊บผ๋‚ด ํ•ด๋‹น ๋…ธ๋“œ์—์„œ ๋‚˜๊ฐ€๋Š” ๊ฐ„์„ ์„ ๊ทธ๋ž˜ํ”„์—์„œ ์ œ๊ฑฐํ•œ๋‹ค.
      • ์ƒˆ๋กญ๊ฒŒ ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ด ๋œ ๋…ธ๋“œ๋ฅผ ํ์— ๋„ฃ๋Š”๋‹ค.

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

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
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();
        StringTokenizer st = null;

        int t = Integer.parseInt(br.readLine());

        for (int i = 0; i < t; i++) {
            st = new StringTokenizer(br.readLine());
            int N = Integer.parseInt(st.nextToken()); // ๊ฑด๋ฌผ ์ˆ˜
            int K = Integer.parseInt(st.nextToken()); // ๊ฑด๋ฌผ ์ง“๋Š” ์ˆœ์„œ ๊ฐœ์ˆ˜

            int[] bt = new int[N + 1]; // ๊ฑด๋ฌผ ์ง“๋Š” ์‹œ๊ฐ„
            ArrayList<Integer>[] adjList = new ArrayList[N + 1]; // ๊ฑด๋ฌผ ์ง“๋Š” ์ˆœ์„œ
            int[] input = new int[N + 1]; // ์„ ํ–‰ ๊ทœ์น™ ์ˆ˜
            int[] dp = new int[N + 1];

            // ๊ฑด๋ฌผ ์ง“๋Š” ์‹œ๊ฐ„ ์ €์žฅ
            st = new StringTokenizer(br.readLine());
            for (int j = 1; j <= N; j++) {
                bt[j] = Integer.parseInt(st.nextToken());
                adjList[j] = new ArrayList<>();
            }

            // ๊ฑด๋ฌผ ์ง“๋Š” ์ˆœ์„œ ์ €์žฅ & ์„ ํ–‰ ๊ทœ์น™ ์นด์šดํŠธ
            for (int j = 0; j < K; j++) {
                st = new StringTokenizer(br.readLine());
                int X = Integer.parseInt(st.nextToken());
                int Y = Integer.parseInt(st.nextToken());
                adjList[X].add(Y);
                input[Y]++;
            }

            // ์„ ํ–‰ ๊ทœ์น™์ด 0๊ฐœ์ธ ๊ฑด๋ฌผ ๋ถ€ํ„ฐ ์‹œ์ž‘
            Queue<Integer> que = new ArrayDeque<>();
            for (int j = 1; j <= N; j++) {
                if (input[j] == 0) {
                    que.add(j);
                    dp[j] = bt[j];
                }
            }

            while (!que.isEmpty()) {
                int now = que.poll();

                for (int next : adjList[now]) { // ํ˜„์žฌ ๊ฑด๋ฌผ๊ณผ ์—ฐ๊ฒฐ๋œ ๊ฑด๋ฌผ์˜ ์„ ํ–‰ ๊ทœ์น™ -1
                    input[next]--;
                    dp[next] = Math.max(dp[now] + bt[next], dp[next]); // ๊ฑด๋ฌผ์„ ์ง“๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„ ์ตœ๋Œ€๊ฐ’์œผ๋กœ ๊ฐฑ์‹ 
                    if (input[next] == 0) { // ์„ ํ–‰ ๊ทœ์น™์ด 0๊ฐœ๊ฐ€ ๋˜๋ฉด ํ์— ๋„ฃ์–ด์ฃผ๊ธฐ
                        que.add(next);
                    }
                }
            }
            sb.append(dp[Integer.parseInt(br.readLine())]).append('\n');
        }
        bw.write(sb.toString());
        bw.flush();
    }
}

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

  • ๊ฑด๋ฌผ ์ˆ˜, ์ง“๋Š” ์ˆœ์„œ, ์ง“๋Š” ์‹œ๊ฐ„์„ ์ž…๋ ฅ๋ฐ›๊ณ , ๊ฐ ๊ฑด๋ฌผ์˜ ์„ ํ–‰ ๊ทœ์น™ ์ˆ˜๋ฅผ ์นด์šดํŠธํ•œ๋‹ค.
  • ์„ ํ–‰๊ทœ์น™ 0์ธ ๊ฑด๋ฌผ๋“ค ๋ถ€ํ„ฐ ํ์— ๋„ฃ๊ณ  ์œ„์ƒ ์ •๋ ฌ๊ณผ DP๋ฅผ ์ ์šฉํ•œ๋‹ค.
    • ํ˜„์žฌ ๊ฑด๋ฌผ๊ณผ ์—ฐ๊ฒฐ ๋œ ๋‹ค์Œ ๊ฑด๋ฌผ์˜ ์ง„์ž… ์ฐจ์ˆ˜๋ฅผ -1 ํ•œ๋‹ค.
    • ๊ฑด๋ฌผ์„ ์ง“๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์˜ ์ตœ๋Œ€๊ฐ’์„ dp์— ๊ฐฑ์‹ ํ•œ๋‹ค.
    • ์ง„์ž… ์ฐจ์ˆ˜๊ฐ€ 0์ด ๋˜๋ฉด ํ์— ๋„ฃ๋Š”๋‹ค.
  • dp ๋ฐฐ์—ด์—์„œ ์ตœ์†Œ์‹œ๊ฐ„์„ ๊ตฌํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฑด๋ฌผ์˜ ์ธ๋ฑ์Šค๋ฅผ ๋„ฃ์–ด ๋‹ต์„ ์ถœ๋ ฅํ•œ๋‹ค.

๐Ÿ”ธ end ๐Ÿ”ธ

  •  ์ฒ˜์Œ์—” ๊ทธ๋ฆฌ๋””๋กœ ํ’€์ดํ•˜๋ ค๊ณ  ํ–ˆ์ง€๋งŒ, ์˜ˆ์ œ 2๋ฒˆ์˜ 3๋ฒˆ์งธ ์ผ€์ด์Šค์—์„œ ์‹คํŒจํ–ˆ๋‹ค. ์„ ํ–‰ ์ž‘์—…์ด ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ๊ฒน์ณ ์žˆ๋Š” ์ƒํƒœ๋ฅผ ๋ฐ˜์˜ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค.
  • ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ƒ๊ฐ๋‚˜์ง€ ์•Š์•„ ํ’€์ด ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ ํ•ด ํ’€์ดํ–ˆ๋‹ค.
    • ์œ„์ƒ ์ •๋ ฌ๊ณผ DP๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค๋Š” ๊ฑธ ์•Œ๊ณ  ๋ฐ”๋กœ ์‰ฝ๊ฒŒ ํ’€์ดํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
    • ์œ„์ƒ ์ •๋ ฌ์€ ์ƒ๊ฐ๋ณด๋‹ค ์–ด๋ ต์ง€ ์•Š์€๋ฐ, ๋’ค๋Šฆ๊ฒŒ ๋ฐฐ์›Œ์„œ ๊ดœํžˆ ์–ด๋ ต๊ฒŒ ์ธ์‹ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ๋” ์—ฐ์Šตํ•˜๋„๋ก ํ•˜์ž.
728x90