2252 : ์ค„ ์„ธ์šฐ๊ธฐ

2252 : ์ค„ ์„ธ์šฐ๊ธฐ#

supposed to be surdarla logo

Surdarla

Nov 28 Tue 15:36, 2023

1 min read

  • https://d2gd6pc034wcta.cloudfront.net/tier/13.svg ๊ณจ๋“œ 3

์‹œ๊ฐ„์ œํ•œ

๋ฉ”๋ชจ๋ฆฌ์ œํ•œ

์ •๋‹ต๋น„์œจ

2์ดˆ

128MB

56.930%

๋ฌธ์ œ#

N๋ช…์˜ ํ•™์ƒ๋“ค์„ ํ‚ค ์ˆœ์„œ๋Œ€๋กœ ์ค„์„ ์„ธ์šฐ๋ ค๊ณ  ํ•œ๋‹ค. ๊ฐ ํ•™์ƒ์˜ ํ‚ค๋ฅผ ์ง์ ‘ ์žฌ์„œ ์ •๋ ฌํ•˜๋ฉด ๊ฐ„๋‹จํ•˜๊ฒ ์ง€๋งŒ, ๋งˆ๋•…ํ•œ ๋ฐฉ๋ฒ•์ด ์—†์–ด์„œ ๋‘ ํ•™์ƒ์˜ ํ‚ค๋ฅผ ๋น„๊ตํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค. ๊ทธ๋‚˜๋งˆ๋„ ๋ชจ๋“  ํ•™์ƒ๋“ค์„ ๋‹ค ๋น„๊ตํ•ด ๋ณธ ๊ฒƒ์ด ์•„๋‹ˆ๊ณ , ์ผ๋ถ€ ํ•™์ƒ๋“ค์˜ ํ‚ค๋งŒ์„ ๋น„๊ตํ•ด ๋ณด์•˜๋‹ค.

์ผ๋ถ€ ํ•™์ƒ๋“ค์˜ ํ‚ค๋ฅผ ๋น„๊ตํ•œ ๊ฒฐ๊ณผ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ค„์„ ์„ธ์šฐ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

input#

  • ์ฒซ์งธ ์ค„์— N(1 โ‰ค N โ‰ค 32,000), M(1 โ‰ค M โ‰ค 100,000)์ด ์ฃผ์–ด์ง„๋‹ค.

  • M์€ ํ‚ค๋ฅผ ๋น„๊ตํ•œ ํšŒ์ˆ˜์ด๋‹ค. ๋‹ค์Œ M๊ฐœ์˜ ์ค„์—๋Š” ํ‚ค๋ฅผ ๋น„๊ตํ•œ ๋‘ ํ•™์ƒ์˜ ๋ฒˆํ˜ธ A, B๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

  • ์ด๋Š” ํ•™์ƒ A๊ฐ€ ํ•™์ƒ B์˜ ์•ž์— ์„œ์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

ํ•™์ƒ๋“ค์˜ ๋ฒˆํ˜ธ๋Š” 1๋ฒˆ๋ถ€ํ„ฐ N๋ฒˆ์ด๋‹ค.

output#

์ฒซ์งธ ์ค„์— ํ•™์ƒ๋“ค์„ ์•ž์—์„œ๋ถ€ํ„ฐ ์ค„์„ ์„ธ์šด ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋‹ต์ด ์—ฌ๋Ÿฌ ๊ฐ€์ง€์ธ ๊ฒฝ์šฐ์—๋Š” ์•„๋ฌด๊ฑฐ๋‚˜ ์ถœ๋ ฅํ•œ๋‹ค.

think#

์œ„์ƒ์ •๋ ฌ์„ ์ด์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด๋ผ ๋ชป ๋ฐ•์•„ ์คฌ๋‹ค. ํ‚ค๊ฐ€ ํฐ ํ•™์ƒ์€ ์ž‘์€ ํ•™์ƒ์œผ๋กœ ์„ ์ด ๊ฐ€์ง€ ์•Š๋Š” ์ผ์ •ํ•œ ๋ฐฉํ–ฅ์„ฑ(? ์ˆœ์„œ)๋ฅผ ๊ฐ€์ง์œผ๋กœ ์ˆœํ™˜ํ•˜์ง€ ์•Š๋Š” ๊ทธ๋ž˜ํ”„๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋“ค์— ๋Œ€ํ•ด์„œ ์ •๋ ฌ์„ ํ•ด์•ผํ•œ๋‹ค. ๊ทธ๋Ÿผ ๋‹ต์ด ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์บ ๊ฒฝ์šฐ๋„ ์•„๋ฌด๊ฑฐ๋‚˜ ํ•˜๋‚˜ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ˆ ์—ญ์‹œ ๊ฐ™์€ ๋“ฑ๊ธ‰์˜ ์ˆœ์„œ์˜ ๋…ธ๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ž„์— ํ‹€๋ฆผ์ด๊ฐ€ ์—†๋‹ค.

โ€“ from su

python#

import sys, os

problem_num = "2252"

path = os.getcwd() + f"\\txt\\{problem_num}" + ".txt"
sys.stdin = open(path, "r")
input = sys.stdin.readline
from collections import deque

node, edge = map(int, input().split())
indegrees = [0] * (node + 1)
graph = [[] for i in range(node + 1)]

for _ in range(edge):
    in_, out_ = map(int, input().split())
    graph[in_].append(out_)
    indegrees[out_] += 1
def topology_sort():
    result = []
    q = deque()
    for i in range(1, node + 1):
        if indegrees[i] == 0:
            q.append(i)
    while q:
        now = q.popleft()
        result.append(now)
        for i in graph[now]:
            # ํ•ด๋‹น ์›์†Œ์™€ ์—ฐ๊ฒฐ๋˜ ๋…ธ๋“œ๋“ค์˜ ์ง„์ž…์ฐจ์ˆ˜ -1
            indegrees[i] -= 1
            if indegrees[i] == 0:
                q.append(i)

    for i in result:
        print(i, end=" ")


topology_sort()
3 4 1 2 

javascript#

Listing 8 nodejs code#
 1    const problem_num = "2252";
 2    const path = `${__dirname}\\txt\\${problem_num}.txt`;
 3    // const path = "/dev/stdin";
 4
 5    const input = require("fs").readFileSync(path, 'utf8').toString().trim().split('\n');
 6    let currentLine = 0;
 7
 8    function readLine() {
 9        return input[currentLine++].split(' ').map(Number);
10    }
11
12    const [node, edge] = readLine();
13    let indegrees = Array(node + 1).fill(0);
14    let graph = Array.from({ length: node + 1 }, () => []);
15
16    for (let i = 0; i < edge; i++) {
17        const [in_, out_] = readLine();
18        graph[in_].push(out_);
19        indegrees[out_] += 1;
20    }
21
22    function topology_sort(node, indegrees) {
23        const result = [];
24        const q = []; // deque style
25        for (let i = 1; i < node + 1; i++) {
26            if (indegrees[i] == 0) {
27                q.push(i)
28            }
29        }
30        while (q.length) {
31            const now = q.shift();
32            result.push(now);
33            for (let i = 0; i < graph[now].length; i++) {
34                const nextNode = graph[now][i];
35                indegrees[nextNode] -= 1;
36                if (indegrees[nextNode] == 0) {
37                    q.push(nextNode);
38                }
39            }
40        }
41        return result;
42    }
43
44    result = topology_sort(node, indegrees);
45    console.log(result.join(' '));
  1. array ์ƒ์„ฑ๋ฐฉ์‹์ด ํŒŒ์ด์ฌ์ด๋ž‘ ์ข€ ๋‹ค๋ฅด๋‹ค

  2. ๋ฆฌ์ŠคํŠธ for ์ˆœํšŒ๋ฅผ ํ• ๋•Œ๋Š” ๋ฐ‘์— const๋กœ const temp = list[i] ์ด๋Ÿฐ์‹์œผ๋กœ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•ด ์ค˜์•ผํ•œ๋‹ค.

  3. javascript array๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ deque์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Java#

Listing 9 java code#
import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int node = Integer.parseInt(st.nextToken());
        int edge = Integer.parseInt(st.nextToken());

        // ์ง„์ž…์ฐจ์ˆ˜ ๋ฐฐ์—ด ์ดˆ๊ธฐํ™”
        int[] indegrees = new int[node + 1];

        // ๊ทธ๋ž˜ํ”„ ์ดˆ๊ธฐํ™”(list of ArrayList)
        ArrayList<ArrayList<Integer>> graph = new ArrayList<>();
        for (int i = 0; i <= node; i++) {
            graph.add(new ArrayList<Integer>());
        }

        // input graph indegrees initialize
        for (int i = 0; i < edge; i++) {
            st = new StringTokenizer(br.readLine());
            int in_ = Integer.parseInt(st.nextToken());
            int out_ = Integer.parseInt(st.nextToken());
            graph.get(in_).add(out_); // [i] ๊ฐ€ ์•„๋‹ˆ๋ผ .get method๋กœ index์•ˆ์— ๊ฒƒ ๊ฐ€์ ธ์˜ด
            indegrees[out_]++;
        }

        ArrayList<Integer> result = new ArrayList<>();
        Queue<Integer> q = new LinkedList<>();

        for (int i = 1; i <= node; i++) {
            if (indegrees[i] == 0) {
                q.add(i);
            }
        }
        while (!q.isEmpty()) {
            int now = q.poll();
            result.add(now);

            for (int i = 0; i < graph.get(now).size(); i++) {
                int nextNode = graph.get(now).get(i);
                indegrees[nextNode]--;

                if (indegrees[nextNode] == 0) {
                    q.add(nextNode);
                }
            }
        }
        for (int i : result) {
            System.out.println(i + " ");
        }
    }
}