๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿ’ป Computer Science/- Data Structure, Algorithm

[์•Œ๊ณ ๋ฆฌ์ฆ˜ PS] ๋ฐฑ์ค€ 1260๋ฒˆ DFS์™€ BFS ์ž๋ฐ” ๋ฌธ์ œํ’€์ด

by Wonit 2021. 2. 7.

๋ฌธ์ œ

ํ•ด๋‹น ํฌ์ŠคํŒ…์€ ๋ฐฑ์ค€์˜ 1260๋ฒˆ DFS์™€ BFS ์˜ ์ ‘๊ทผ๊ณผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•œ ๊ธ€ ์ž…๋‹ˆ๋‹ค.
์ •๋‹ต ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜์‹œ๋ ค๋ฉด solve url ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๋จผ์ € ์ƒ๊ฐํ•ด๋ณด์ž.

ํ•ด๊ฒฐ๋ฒ•

ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ์šฐ์„  ๊ทธ๋ž˜ํ”„๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.


๊ทธ๋ž˜ํ”„๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ํฌ๊ฒŒ 2๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.


์ด 2๊ฐ€์ง€ (์ธ์ ‘ ํ–‰๋ ฌ, ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ)๋กœ ์šฐ์„  ๊ทธ๋ž˜ํ”„๋ฅผ ๊ตฌํ˜„ ํ•œ ๋’ค ํƒ์ƒ‰์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.


๋งŒ์•ฝ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์ง€ ๋ชปํ•œ๋‹ค๋ฉด ์•„๋ž˜ ๋งํฌ๋ฅผ ํ†ตํ•ด์„œ ํ•œ ๋ฒˆ ํ™•์ธํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์€ ์„ ํƒ์ด๋‹ค.

๊ทธ๋ž˜ํ”„์˜ DFS์™€ BFS๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

  1. ์Šคํƒ์œผ๋กœ DFS ๊ตฌํ˜„ํ•˜๊ธฐ
  2. ์žฌ๊ท€ ํ˜ธ์ถœ๋กœ DFS ๊ตฌํ˜„ํ•˜๊ธฐ
  3. ํ๋กœ BFS ๊ตฌํ˜„ํ•˜๊ธฐ

์œ„์˜ 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ๋ชจ๋‘ ๊ฒฝํ—˜ํ•ด๋ณด๋ฉฐ ์‹คํ–‰์‹œ๊ฐ„์„ ๋น„๊ตํ•ด๋ณด์ž.

์ ‘๊ทผ๋ฒ•

์šฐ์„  ์šฐ๋ฆฌ๋Š” ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ์™€ ๋ฐฉ๋ฌธ ์ฒดํฌ ๋ฐฐ์—ด์˜ ๊ธธ์ด๋ฅผ ์ž…๋ ฅ ๋ฐ›์€ ๊ธธ์ด + 1๋กœ ์“ธ ๊ฒƒ์ด๋‹ค.
์—ฌ๊ธฐ์„œ 2๊ฐ€์ง€ ์˜ต์…˜์ด ์กด์žฌํ•œ๋‹ค.

  1. ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ์™€ ๋ฐฉ๋ฌธ ์ฒดํฌ ๋ฐฐ์—ด์˜ ๊ธธ์ด๋ฅผ ์ž…๋ ฅ ๋ฐ›์€ ๊ธธ์ด ๊ทธ๋Œ€๋กœ ์“ธ ๊ฒƒ์ธ๊ฐ€.
  2. ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ์™€ ๋ฐฉ๋ฌธ ์ฒดํฌ ๋ฐฐ์—ด์˜ ๊ธธ์ด๋ฅผ ์ž…๋ ฅ ๋ฐ›์€ ๊ธธ์ด + 1๋กœ ์“ธ ๊ฒƒ์ธ๊ฐ€.

1๋ฒˆ์˜ ๊ฒฝ์šฐ ์ถœ๋ ฅ๊ณผ ๊ทธ๋ž˜ํ”„ ์ž‘์—…์— + 1๊ณผ -1์„ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

 

ํ•˜์ง€๋งŒ 2๋ฒˆ์˜ ๊ฒฝ์šฐ 1๋ฒˆ์— ๋น„ํ•ด ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋” ์“ฐ๊ฒ ์ง€๋งŒ ๊ทธ๋ž˜๋„ ์šฐ๋ฆฌ๊ฐ€ ์ฝ”๋”ฉํ•˜๊ธฐ ํŽธํ•˜๋‹ค.

 

์ด์ œ ์‹ค์งˆ์ ์œผ๋กœ DFS์™€ BFS๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด์ž.

์Šคํƒ์œผ๋กœ DFS ๊ตฌํ˜„ํ•˜๊ธฐ

private static void dfsByStack(int x) {
  Stack<Integer> stack = new Stack<>();
  boolean flag;
  visited[x] = true;
  sb.append(x).append(" ");
  stack.push(x);
  while(!stack.isEmpty()) {
      x = stack.peek();
      int size = graph.get(x).size();
      flag = false;
      for (int i = 0; i < size; i++) {
          int value = graph.get(x).get(i);
          if (!visited[value]) {
              stack.push(value);
              sb.append(value).append(" ");
              visited[value] = true;
              flag = true;
              break;
          }
      }
      if(!flag) {
          stack.pop();
      }
  }
}

์žฌ๊ท€ํ˜ธ์ถœ๋กœ DFS ๊ตฌํ˜„ํ•˜๊ธฐ

private static void dfsByRecursive(int x) {
  if(visited[x]) return; // ๋ฐฉ๋ฌธํ•œ ์ ์ด ์žˆ๋Š” ๋…ธ๋“œ๋ฉด ๋ฐ”๋กœ ๋‚˜๊ฐ€
  visited[x] = true;
  sb.append(x).append(" ");
  for(int value : graph.get(x)) {
    if(!visited[value]) dfsByRecursive(value);
  }
}

ํ๋กœ BFS ๊ตฌํ˜„ํ•˜๊ธฐ

private static void bfs(int start) {
  Queue<Integer> queue = new LinkedList<>();
  visited[start] = true;
  queue.add(start);

while(!queue.isEmpty()) {
    int x = queue.remove();
    sb.append(x).append(" ");
    for (int i = 0; i < graph.get(x).size(); i++) {
        int value = graph.get(x).get(i);
        if(!visited[value]) {
            visited[value] = true;
            queue.add(value);
        }
    }
  }
}

์˜ค๋‹ต ํ›„๋ณด

๋ฌธ์ œ์—์„œ ์ •์  ๋ฒˆํ˜ธ๊ฐ€ ์ž‘์€ ๊ฒƒ์„ ๋จผ์ € ๋ฐฉ๋ฌธํ•˜๋ผ๊ณ  ํ–ˆ๋‹ค.


์ •์  ๋ฒˆํ˜ธ๊ฐ€ ์ž‘์€ ๊ฒƒ ๋ถ€ํ„ฐ ๋ฐฉ๋ฌธ ํ•˜๋ ค๋ฉด ์šฐ๋ฆฌ์˜ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ์— ์กด์žฌํ•˜๋Š” ๊ฐ๊ฐ์˜ ๋ฆฌ์ŠคํŠธ๋“ค์ด ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

 

๊ทธ๋ž˜์„œ ๊ทธ๋ž˜ํ”„ ๊ตฌํ˜„์ด ๋๋‚˜๊ณ  ์‹ค์งˆ์ ์ธ ํƒ์ƒ‰์— ๋“ค์–ด๊ฐ€๊ธฐ ์ „์— ์ •๋ ฌ์„ ํ•ด์ฃผ๋„๋ก ํ•˜๋ฉด ๋œ๋‹ค.

์ •๋‹ต ์ฝ”๋“œ

public class Main {

    static ArrayList<ArrayList<Integer>> graph = new ArrayList<>();
    static boolean[] visited;
    static StringBuilder sb = new StringBuilder();

    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        String[] nmv = br.readLine().split(" ");

        int n = Integer.parseInt(nmv[0]);
        int m = Integer.parseInt(nmv[1]);
        int v = Integer.parseInt(nmv[2]);

        // ๋ฐฉ๋ฌธ ์ฒดํฌ ๋ฐฐ์—ด ์ƒ์„ฑ

        // ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ์ดˆ๊ธฐํ™”
        for (int i = 0; i <= n; i++) {
            graph.add(new ArrayList<>());
        }

        // ์ž…๋ ฅ ์ฒ˜๋ฆฌ (๊ทธ๋ž˜ํ”„ ์—ฐ๊ฒฐ)
        for(int i = 0; i < m; i++) {
            String[] n1n2 = br.readLine().split(" ");
            int n1 = Integer.parseInt(n1n2[0]);
            int n2 = Integer.parseInt(n1n2[1]);

            graph.get(n1).add(n2);
            graph.get(n2).add(n1);
        }
        for (int i = 0; i <= n; i++) {
            Collections.sort(graph.get(i));
        }

        visited = new boolean[n + 1];
        dfsByRecursive(v);
        bw.flush();
        sb.append("\n");
        visited = new boolean[n + 1];
        bfs(v);
        System.out.println(sb.toString());
        bw.flush();
        bw.close();
    }

    private static void dfsByStack(int x) {
        Stack<Integer> stack = new Stack<>();
        boolean flag;
        visited[x] = true;
        sb.append(x).append(" ");
        stack.push(x);
        while(!stack.isEmpty()) {
            x = stack.peek();
            int size = graph.get(x).size();
            flag = false;
            for (int i = 0; i < size; i++) {
                int value = graph.get(x).get(i);
                if (!visited[value]) {
                    stack.push(value);
                    sb.append(value).append(" ");
                    visited[value] = true;
                    flag = true;
                    break;
                }
            }
            if(!flag) {
                stack.pop();
            }
        }
    }

    private static void dfsByRecursive(int x) {
        visited[x] = true;

        sb.append(x).append(" ");

        int size = graph.get(x).size();

        for (int i = 0; i < size; i++) {
            int value = graph.get(x).get(i);
            if(!visited[value]) {
                dfsByRecursive(value);
            }
        }
    }

    private static void bfs(int start) {
        Queue<Integer> queue = new LinkedList<>();
        visited[start] = true;
        queue.add(start);

        while(!queue.isEmpty()) {
            int x = queue.remove();
            sb.append(x).append(" ");
            for (int i = 0; i < graph.get(x).size(); i++) {
                int value = graph.get(x).get(i);
                if(!visited[value]) {
                    visited[value] = true;
                    queue.add(value);
                }
            }
        }
    }
}

 


๋ฌธ์ œ ํšŒ๊ณ 

์ด๋ฒˆ ๋ฌธ์ œ์—์„œ๋Š” ์ถœ๋ ฅ์—์„œ ์• ๋ฅผ ๋งŽ์ด ๋จน์—ˆ๋‹ค.
๋ฉ”์„œ๋“œ์—์„œ sb๋กœ append๋ฅผ ํ•ด์ฃผ๋Š” ๋กœ์ง์—์„œ ๋‚˜๋Š” ํ•œ ๋ฒˆ์˜ ํƒ์ƒ‰์ด ๋๋‚  ๋•Œ bw๋กœ ์ถœ๋ ฅํ•˜๋ ค ํ–ˆ๋‹ค.
๊ทธ๋ž˜์„œ ๋งŒ์•ฝ ๋‹ต์ด 4๊ฐœ๋ผ๋ฉด 8๊ฐœ๊ฐ€ ์ถœ๋ ฅ๋˜๊ณค ํ–ˆ๋‹ค.
๋ฌธ์ œ์˜ ๋กœ์ง์„ ์งœ๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•˜๋‚˜ ์ถœ๋ ฅ ๊ด€๋ฆฌ๋„ ์ค‘์š”ํ•˜๋‹จ ๊ฒƒ์„ ๋˜ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

์ •๋‹ต ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜์‹œ๋ ค๋ฉด solve url ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋Œ“๊ธ€