[BOJ][Java] 11437. LCA

2025. 10. 28. 14:32ยท๐Ÿ’ญ Problem Solving/Java

๋ฌธ์ œ

https://www.acmicpc.net/problem/11437

 

 

๋ฌธ์ œ ํ’€์ด

DFS๋กœ parent/depth ์ €์žฅ → ๊นŠ์ด ๋งž์ถ”๊ธฐ → ํ•จ๊ป˜ ์˜ฌ๋ผ๊ฐ€๋ฉด์„œ ๊ฐ™์•„์ง€๋Š” ์ง€์  ๋ฐ˜ํ™˜

 

  1. ํŠธ๋ฆฌ DFS๋กœ ๊ฐ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ, ๊นŠ์ด ์ €์žฅํ•˜๊ธฐ
  • ๋ฃจํŠธ๋ถ€ํ„ฐ ์ž์‹์œผ๋กœ ๋‚ด๋ ค๊ฐ€๋ฉด์„œ parent, depth ๋ฐฐ์—ด์— ์ €์žฅ
  • ๋ฃจํŠธ(1)๋Š” ๋ถ€๋ชจ๋ฅผ ์ž๊ธฐ ์ž์‹ (1)์œผ๋กœ, ๊นŠ์ด๋Š” 0์œผ๋กœ (dfs(1, 1, 0))

 

  1. LCA ๊ตฌํ•˜๊ธฐ
  • ๊นŠ์ด ๋งž์ถ”๊ธฐ
    • ๋” ๊นŠ์€ ์ชฝ์„ ๋ถ€๋ชจ๋กœ ์˜ฌ๋ ค์„œ depth[a] == depth[b]๋กœ ๋งŒ๋“ฆ.
  • ๊ณตํ†ต ์กฐ์ƒ ์ฐพ๊ธฐ
    • a == b๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ๋‘˜ ๋‹ค parent๋กœ ์˜ฌ๋ผ๊ฐ.
    • ๊ฐ™์•„์ง€๋ฉด ๊ทธ ๋…ธ๋“œ๊ฐ€ LCA.

 

์œ ์˜ํ•  ์  (์˜ˆ์™ธ)

a, b๊ฐ€ ๊ฐ™์€ ๋…ธ๋“œ์ด๊ฑฐ๋‚˜, ํ•œ์ชฝ์ด ๋‹ค๋ฅธ ์ชฝ์˜ ์กฐ์ƒ์ผ ์ˆ˜ ์žˆ๋‹ค.
์ด๋•Œ LCA๋Š” ๊ทธ ๋…ธ๋“œ ์ž์‹ ์ด์–ด์•ผ ํ•œ๋‹ค.

 

์ž˜๋ชป๋œ ์ฝ”๋“œ

while (parent[a] != parent[b]) {
    a = parent[a];
    b = parent[b];
}
return parent[a]; // ๋ถ€๋ชจ๋ฅผ ๋ฐ˜ํ™˜

๊ณตํ†ต ๋ถ€๋ชจ๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด๋ผ์„œ a, b์˜ ๋ถ€๋ชจ๊ฐ€ ๊ฐ™์„ ๋•Œ๊นŒ์ง€ ์˜ฌ๋ผ๊ฐ€๊ณ  ๊ฐ™์œผ๋ฉด ๋ถ€๋ชจ๋ฅผ ๋ฐ˜ํ™˜ํ–ˆ๋‹ค.
์ด๋Ÿด ๊ฒฝ์šฐ, ๊นŠ์ด๋ฅผ ๋งž์ถ˜ ํ›„์— ๋‘ ๋…ธ๋“œ๊ฐ€ ๊ฐ™์„ ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
๋‘ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๋ฅผ ๋ฐ˜ํ™˜ → ํ•œ ๋‹จ๊ณ„ ๋” ์˜ฌ๋ผ๊ฐ„ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์„œ ์˜ค๋‹ต์ด ์ถœ๋ ฅ๋œ๋‹ค.

 

์ˆ˜์ •ํ•œ ์ฝ”๋“œ

while (a != b) {
    a = parent[a];
    b = parent[b];
}

return a;

 

์ฝ”๋“œ

import java.util.*;
import java.io.*;

public class Main {
    static int n;
    static int[] parent;
    static int[] depth;
    static List<Integer>[] edge;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        n = Integer.parseInt(br.readLine()); // ๋…ธ๋“œ ๊ฐœ์ˆ˜
        parent = new int[n + 1];
        depth = new int[n + 1];
        edge = new ArrayList[n + 1];
        for (int i = 0; i <= n; i++) {
            edge[i] = new ArrayList<>();
        }

        for (int i = 0; i < n - 1; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());

            edge[a].add(b);
            edge[b].add(a);
        } // ์ž…๋ ฅ1 ๋

        dfs(1, 1, 0); // ๋ถ€๋ชจ, ๊นŠ์ด ์ €์žฅ

        StringBuilder sb = new StringBuilder();
        int m = Integer.parseInt(br.readLine());

        while (m-- > 0) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());

            sb.append(lca(a, b)).append("\n");
        } // ์ž…๋ ฅ2 & ์—ฐ์‚ฐ

        System.out.println(sb);
    }

    static void dfs(int cur, int p, int d) {
        parent[cur] = p;
        depth[cur] = d;

        for (int next : edge[cur]) {
            if (next == p)
                continue;

            dfs(next, cur, d + 1);
        }
    }

    static int lca(int a, int b) {
        // ๊นŠ์ด ๋งž์ถ”๊ธฐ
        while (depth[a] < depth[b])
            b = parent[b];

        while (depth[a] > depth[b])
            a = parent[a];

        // ๊ณตํ†ต ์กฐ์ƒ ์ฐพ๊ธฐ
        while (a != b) {
            a = parent[a];
            b = parent[b];
        }

        return a;
    }
}

'๐Ÿ’ญ Problem Solving > Java' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[BOJ][Java] 18808. ์Šคํ‹ฐ์ปค ๋ถ™์ด๊ธฐ  (0) 2025.11.08
[BOJ][Java] 21608. ์ƒ์–ด ์ดˆ๋“ฑํ•™๊ต  (3) 2025.10.21
[BOJ][Java] 20056. ๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด์™€ ํŒŒ์ด์–ด๋ณผ  (0) 2025.10.15
[BOJ][Java] 16236. ์•„๊ธฐ ์ƒ์–ด  (0) 2025.10.01
[BOJ][Java] 2533. ์‚ฌํšŒ๋ง ์„œ๋น„์Šค(SNS)  (0) 2025.09.24
'๐Ÿ’ญ Problem Solving/Java' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [BOJ][Java] 18808. ์Šคํ‹ฐ์ปค ๋ถ™์ด๊ธฐ
  • [BOJ][Java] 21608. ์ƒ์–ด ์ดˆ๋“ฑํ•™๊ต
  • [BOJ][Java] 20056. ๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด์™€ ํŒŒ์ด์–ด๋ณผ
  • [BOJ][Java] 16236. ์•„๊ธฐ ์ƒ์–ด
0=2.
0=2.
  • 0=2.
    0=2
    0=2.
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (104)
      • ๐Ÿ“‚ Project (2)
        • Paint the City (2)
      • ๐Ÿ’ญ Problem Solving (42)
        • C++ (28)
        • Java (14)
      • ๐Ÿ“ Study (17)
        • React (1)
        • Java (16)
      • ๐Ÿ’ป CS (11)
        • ๋ฉด์ ‘์„ ์œ„ํ•œ CS ์ „๊ณต์ง€์‹ ๋…ธํŠธ (2)
        • ์ •๋ณด์ฒ˜๋ฆฌ๊ธฐ์‚ฌ (9)
      • ๐Ÿƒ‍โ™€๏ธ Activities (32)
        • Web Front-End Basic Study (6)
        • 42 Cursus (26)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
    • ๊ธ€์“ฐ๊ธฐ
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ์ •๋ ฌ
    knapsack
    unity
    ๋ธŒ๋ฃจํŠธํฌ์Šค
    git
    ๋งต
    dfs
    CS
    CSS
    ์‹œ๋ฎฌ๋ ˆ์ด์…˜
    java
    ์ •๋ณด์ฒ˜๋ฆฌ๊ธฐ์‚ฌ
    42๊ฒฝ์‚ฐ
    .h
    VR
    La Piscine
    react
    HTML
    ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜
    ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค
    BFS
    ํŠธ๋ฆฌ
    ๋ฐฑํŠธ๋ž˜ํ‚น
    C
    ๋ฐฑ์ค€
    github
    ๊ตฌํ˜„
    dynamic programming
    makefile
    swea
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
0=2.
[BOJ][Java] 11437. LCA
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”