자바 코딩테스트 강좌, 최소 신장 트리

1. 최소 신장 트리란?

최소 신장 트리(Minimum Spanning Tree, MST)는 가중치가 할당된 무방향 그래프에서 모든 정점을 포함하면서 전체 가중치의 합이 최소가 되는 트리를 말합니다. 최소 신장 트리는 네트워크 설계, 클러스터링 및 여러 최적화 문제에 사용됩니다.

2. 알고리즘 개요

최소 신장 트리를 찾기 위한 대표적인 알고리즘으로는 크루스칼 알고리즘(Kruskal’s Algorithm)과 프림 알고리즘(Prim’s Algorithm)이 있습니다. 이 두 가지 알고리즘은 각각 다른 방식으로 MST를 구성합니다.

2.1. 크루스칼 알고리즘

크루스칼 알고리즘은 그래프의 간선을 가중치에 따라 오름차순으로 정렬한 후, 사이클을 형성하지 않도록 간선을 추가하여 MST를 구성하는 방식입니다.

2.2. 프림 알고리즘

프림 알고리즘은 시작 정점에서 출발하여 현재 연결된 정점 중 가장 가중치가 낮은 간선을 선택하여 MST를 확장해 나가는 방식입니다.

2.3. 알고리즘 선택

두 가지 알고리즘 모두 효율적으로 MST를 찾을 수 있지만, 크루스칼은 간선의 수가 적은 희소 그래프에 더 적합하고, 프림은 정점의 수가 적은 밀접 그래프에 적합합니다.

3. 문제 설명

문제: 최소 신장 트리 만들기

가중치가 있는 무방향 그래프가 주어질 때, 최소 신장 트리를 구하시오. 입력은 다음과 같은 형식입니다:

  • 첫 번째 줄에 정점의 수 V와 간선의 수 E가 주어진다.
  • 다음 E개의 줄에 각각 u, v, w가 주어져, 이는 정점 uv를 연결하는 가중치 w의 간선을 의미한다.

출력으로 최소 신장 트리의 가중치 합을 출력하시오.

4. 문제 풀이 접근법

문제를 해결하기 위해 다음 단계를 따릅니다:

  1. 입력값을 읽어들인다.
  2. 간선을 가중치에 따라 정렬한다.
  3. 유니온-파인드(Union-Find) 자료구조를 사용하여 사이클을 검출한다.
  4. 사이클이 형성되지 않는 간선을 MST에 추가한다.
  5. MST의 가중치 합을 계산하여 출력한다.

5. 자바 코드 구현

5.1. 유니온-파인드 자료구조 구현

class UnionFind {
    private int[] parent;
    private int[] rank;

    public UnionFind(int size) {
        parent = new int[size];
        rank = new int[size];
        for (int i = 0; i < size; i++) {
            parent[i] = i;
            rank[i] = 0;
        }
    }

    public int find(int p) {
        if (parent[p] != p) {
            parent[p] = find(parent[p]);
        }
        return parent[p];
    }

    public void union(int p, int q) {
        int rootP = find(p);
        int rootQ = find(q);
        if (rootP != rootQ) {
            if (rank[rootP] > rank[rootQ]) {
                parent[rootQ] = rootP;
            } else if (rank[rootP] < rank[rootQ]) {
                parent[rootP] = rootQ;
            } else {
                parent[rootQ] = rootP;
                rank[rootP]++;
            }
        }
    }
}
    

5.2. 크루스칼 알고리즘 구현

import java.util.*;

class Edge implements Comparable {
    int u, v, weight;

    public Edge(int u, int v, int weight) {
        this.u = u;
        this.v = v;
        this.weight = weight;
    }

    @Override
    public int compareTo(Edge other) {
        return Integer.compare(this.weight, other.weight);
    }
}

public class MinimumSpanningTree {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int V = scanner.nextInt();
        int E = scanner.nextInt();

        PriorityQueue edgeList = new PriorityQueue<>();
        for (int i = 0; i < E; i++) {
            int u = scanner.nextInt();
            int v = scanner.nextInt();
            int weight = scanner.nextInt();
            edgeList.add(new Edge(u, v, weight));
        }

        UnionFind uf = new UnionFind(V);
        int totalWeight = 0;

        while (!edgeList.isEmpty()) {
            Edge edge = edgeList.poll();
            if (uf.find(edge.u) != uf.find(edge.v)) {
                uf.union(edge.u, edge.v);
                totalWeight += edge.weight;
            }
        }

        System.out.println(totalWeight);
    }
}
    

6. 코드 설명

위의 코드는 크루스칼 알고리즘을 구현한 것입니다. 먼저, 입력으로 정점의 수와 간선의 수를 읽고 각 간선에 대한 정보를 저장합니다. 이후 간선을 가중치에 따라 정렬하고, 유니온-파인드 자료구조를 사용하여 사이클을 형성하지 않는 간선을 선택합니다. 최종적으로, 선택된 간선의 가중치 합을 출력합니다.

7. 시간 복잡도

크루스칼 알고리즘의 시간 복잡도는 일반적으로 O(E log E)로, 이는 간선 정렬에 대한 복잡도입니다. 유니온-파인드 연산은 매우 효율적이며 거의 상수 시간에 수행됩니다.

8. 마무리

최소 신장 트리는 그래프 이론에서 중요한 개념으로, 다양한 최적화 문제에 활용됩니다. 크루스칼과 프림 알고리즘을 이해하고 구현함으로써 최소 신장 트리를 쉽게 구할 수 있습니다. 이번 강좌를 통해 MST의 개념을 숙지하고, 실제 코딩테스트 문제에 적용할 수 있는 능력을 키우길 바랍니다.

자바 코딩테스트 강좌, 최소 공통 조상 구하기 2

문제 설명

주어진 이진 트리에서 두 노드의 최소 공통 조상(LCA)을 찾는 문제는 다양한 알고리즘 문제 해결에서 중요하게 다뤄집니다. 이 문제는 특히 트리 구조를 이해하고 재귀적인 사고를 요구합니다. 이 글에서는 최소 공통 조상을 구하는 방법을 심층적으로 살펴보겠습니다.

문제 정의

이진 트리의 루트 노드와 두 노드 A, B가 주어질 때, A와 B의 최소 공통 조상을 찾는 문제를 해결해야 합니다. 최소 공통 조상은 다음 조건을 만족하는 가장 깊은 (최하위) 노드로 정의됩니다:

  • 노드 A와 B의 모든 조상이 포함되어야 합니다.
  • 노드 LCA는 A와 B가 위치한 서브트리 안에 존재해야 합니다.

제약 조건

주어진 이진 트리는 다음과 같은 제약을 가집니다:

  • 노드의 수는 1 이상 10^4 이하입니다.
  • 각 노드는 서로 다른 값을 가지고 있습니다.
  • A와 B는 반드시 트리에 존재하는 노드입니다.

문제 해결 전략

1. 트리 구조 이해하기

트리는 계층적 데이터 구조로 노드와 간선으로 구성됩니다. 이진 트리의 경우, 각 노드는 최대 두 개의 자식을 가질 수 있습니다. 트리의 깊이를 기반으로 최소 공통 조상을 찾기 위해 다음과 같은 자원을 확보해야 합니다.

2. 알고리즘 선택

후보 알고리즘으로는 DFS(Depth-First Search)를 사용할 수 있습니다. 이 접근 방식은 다음과 같은 단계로 진행됩니다:

  1. 루트 노드에서 시작하여 좌우 서브트리를 탐색합니다.
  2. 두 노드 A 및 B가 각각의 서브트리에 존재하는 경우, 현재 노드가 LCA가 됩니다.
  3. A 또는 B가 하나의 서브트리에만 존재하는 경우, 해당 노드를 반환합니다.
  4. 둘 다 존재하지 않으면 null을 반환합니다.

파이썬 구현


# 이진 트리 노드 정의
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

# LCA 찾기
def lowestCommonAncestor(root, p, q):
    if root is None:
        return None
    
    if root == p or root == q:
        return root
    
    left = lowestCommonAncestor(root.left, p, q)
    right = lowestCommonAncestor(root.right, p, q)
    
    if left and right:
        return root
    return left if left else right
    

구현 설명

1. TreeNode 클래스

먼저, TreeNode 클래스를 정의하여 각 노드의 값을 저장합니다. 노드는 값 (val) 외에도 왼쪽 자식 (left)과 오른쪽 자식 (right) 노드를 각각 참조합니다.

2. lowestCommonAncestor 함수

주어진 루트 노드에서 시작하여 재귀적으로 호출하여 두 노드 A와 B의 LCA를 찾아냅니다. 기저 사례로는 노드가 null이거나 루트가 A 또는 B일 경우, 현재 노드를 반환합니다.

각각의 서브트리에서 LCA를 찾는 중이기 때문에, 왼쪽 서브트리와 오른쪽 서브트리에서 반환된 값이 모두 존재하면, 현재 노드가 LCA가 됩니다.

3. 문제 해결

이제 이 알고리즘을 사용하여 주어진 이진 트리의 두 노드 A, B에 대한 LCA를 찾을 수 있습니다. 알고리즘의 시간 복잡도는 O(N)이며, N은 노드의 수입니다.

성능 검증

이 알고리즘을 다양한 입력에 대해 테스트하여 성능을 검증할 수 있습니다. 예를 들어, 입력으로 다음과 같은 이진 트리를 고려해 볼 수 있습니다.


    # 예시 트리 생성
    root = TreeNode(3)
    root.left = TreeNode(5)
    root.right = TreeNode(1)
    root.left.left = TreeNode(6)
    root.left.right = TreeNode(2)
    root.right.left = TreeNode(0)
    root.right.right = TreeNode(8)
    root.left.right.left = TreeNode(7)
    root.left.right.right = TreeNode(4)

    p = root.left         # Node with value 5
    q = root.left.right.right  # Node with value 4

    ancestor = lowestCommonAncestor(root, p, q)
    print(ancestor.val)  # Expected output: 5
    

결론

이번 강좌에서는 자바 코딩테스트의 중요한 개념 중 하나인 최소 공통 조상 구하기에 대해 심도 있게 다루었습니다. 이 알고리즘은 다양한 상황에서 활용될 수 있으며, 트리 구조를 이해하는 데 매우 유용합니다. 문제 해결 과정과 알고리즘 분석을 통해 코딩 테스트 대비에 도움이 되길 바랍니다.

추가적인 질문이 있다면 댓글로 남겨 주세요. 감사합니다!

자바 코딩테스트 강좌, 최소 공통 조상 구하기 1

코딩 테스트 준비생들을 위한 알고리즘 문제 풀이 강좌입니다. 이번 글에서는 최소 공통 조상을 구하는 알고리즘을 다루고, 이를 해결하기 위한 다양한 전략과 자바 코드를 설명하겠습니다.

문제 정의

주어진 이진 트리에서 두 노드의 최소 공통 조상(LCA: Lowest Common Ancestor)을 찾는 문제입니다. LCA는 두 노드의 조상 중에서 가장 낮은 노드를 의미합니다. 이 문제는 트리 구조와 재귀적인 탐색 방법을 이해하는 데 중요한 예제입니다.

예를 들어, 다음과 같은 이진 트리가 주어진다면:

                 3
                / \
               5   1
              / \ / \
             6  2 0  8
               / \
              7   4
            

노드 5와 1의 최소 공통 조상은 3이고, 노드 5와 4의 최소 공통 조상은 5입니다.

문제 접근법

이 문제를 해결하기 위해서는 다양한 접근법이 있을 수 있지만, 가장 일반적인 방법은 깊이 우선 탐색(DFS: Depth First Search)을 사용하는 것입니다. 아래의 두 가지 접근 방법을 통해 문제를 해결하는 방식을 살펴보겠습니다.

1. 재귀적 DFS 접근법

재귀를 사용하여 이진 트리를 탐색하면서 각 노드가 두 노드의 조상인지 확인하는 방법입니다. 기본적인 아이디어는 다음과 같습니다.

  • 현재 노드가 null인 경우 null을 반환합니다.
  • 현재 노드가 처음 찾으려는 노드 중 하나인 경우 현재 노드를 반환합니다.
  • 좌측 및 우측 자식 노드를 재귀적으로 호출하여 결과를 받습니다.
  • 좌측 및 우측 자식 노드에서 반환된 값이 모두 null이 아닌 경우, 현재 노드가 최소 공통 조상입니다.
  • 그 외의 경우에는 null이 아닌 자식을 반환합니다.

2. 부모 노드 맵을 이용한 탐색

이 방법에서는 각 노드의 부모를 저장하는 맵을 먼저 만든 후, 다음과 같은 과정을 진행합니다.

  • 첫 번째 노드부터 시작하여 부모 노드를 맵에 저장합니다.
  • 두 번째 노드의 조상을 저장한 후, 각 조상을 부모 맵에서 확인합니다.
  • 첫 번째 노드에서 두 번째 노드의 조상으로 올라가면서 최초로 만나는 조상이 최소 공통 조상입니다.

자바 코드 구현

이제 위에서 설명한 두 접근법을 사용하여 자바 코드로 구현해보겠습니다.

첫 번째 접근법: 재귀적 DFS

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

public class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if (root == null || root == p || root == q) {
            return root;
        }
        
        TreeNode left = lowestCommonAncestor(root.left, p, q);
        TreeNode right = lowestCommonAncestor(root.right, p, q);
        
        if (left != null && right != null) {
            return root;
        }
        return left != null ? left : right;
    }
}
            

두 번째 접근법: 부모 노드 맵 이용

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

public class Solution {
    private Map parentMap = new HashMap<>();
    
    public void buildParentMap(TreeNode root) {
        if (root.left != null) {
            parentMap.put(root.left, root);
            buildParentMap(root.left);
        }
        if (root.right != null) {
            parentMap.put(root.right, root);
            buildParentMap(root.right);
        }
    }
    
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        buildParentMap(root);
        
        HashSet ancestors = new HashSet<>();
        
        while (p != null) {
            ancestors.add(p);
            p = parentMap.get(p);
        }
        
        while (!ancestors.contains(q)) {
            q = parentMap.get(q);
        }
        return q;
    }
}
            

테스트 케이스

이 구현을 검증하기 위해 몇 가지 테스트 케이스를 살펴보겠습니다:

  • 트리: 위의 예시와 같이 구성하고, 노드 5와 1의 LCA를 찾습니다. 결과는 3이어야 합니다.
  • 트리: 또한, 노드 5와 4의 LCA를 찾습니다. 결과는 5이어야 합니다.
  • 트리: 노드 6과 7의 경우 LCA는 5이어야 합니다.

결론

이번 글에서는 자바를 사용하여 이진 트리의 최소 공통 조상을 찾는 방법에 대해 자세히 알아보았습니다. 재귀적 접근법과 부모 노드 맵을 이용한 접근법을 통해 LCA를 효과적으로 찾을 수 있습니다. 이러한 알고리즘을 이해하고 구현하는 것은 프로그래밍 인터뷰에서 좋은 평가를 받을 수 있는 기초가 됩니다.

문제 해결 능력을 기르는 것은 중요하며, 다양한 문제를 풀고 경험을 쌓는 것이 필요합니다. 충분한 연습을 통해 코딩 테스트에 대비하세요!

자바 코딩테스트 강좌, 최소 공배수 구하기

이번 글에서는 자바를 이용한 코딩테스트에서 자주 출제되는 문제인 최소 공배수(Least Common Multiple, LCM)를 구하는 방법에 대해 깊이 있게 다루어보겠습니다. 최소 공배수는 두 개 이상의 수의 배수 중에서 가장 작은 수를 말하며, 다양한 알고리즘 문제에서 매우 중요한 역할을 합니다.

1. 문제 정의

다음은 최소 공배수를 구하는 문제의 간단한 정의입니다.

        문제: 두 정수 a와 b가 주어졌을 때, a와 b의 최소 공배수를 구하시오.
        예시:
        입력: a = 4, b = 6
        출력: 12
    

2. 최소 공배수(L.C.M)란?

최소 공배수는 두 수의 배수 중에서 가장 작은 수를 의미합니다. 예를 들어, 4와 6의 배수는 다음과 같습니다:

  • 4의 배수: 4, 8, 12, 16, 20, …
  • 6의 배수: 6, 12, 18, 24, 30, …

위의 예시에서 4와 6의 배수 중 가장 작은 수는 12입니다. 따라서 12가 4와 6의 최소 공배수입니다.

3. 공약수와 공배수

최소 공배수를 이해하기 위해서는 먼저 최대 공약수(Greatest Common Divisor, GCD)에 대한 이해가 필요합니다. 최대 공약수는 두 수의 공통 약수 중에서 가장 큰 수를 의미합니다. 최소 공배수는 최대 공약수를 이용하여 다음과 같이 계산할 수 있습니다:

        LCM(a, b) = (a * b) / GCD(a, b)
    

위의 공식을 사용하면 큰 수에 대해서도 빠르고 효율적으로 최소 공배수를 구할 수 있습니다.

4. 알고리즘 설계

최소 공배수를 구하는 알고리즘은 다음과 같이 설계할 수 있습니다:

  1. 두 정수 a와 b를 입력받는다.
  2. GCD(a, b)를 구한다.
  3. LCM(a, b)를 계산한다.
  4. 결과를 출력한다.

5. 자바 코드 구현

이제 자바코드를 통해 위의 알고리즘을 구현해 보겠습니다.

        public class LCMCalculator {
            // 최대 공약수(GCD) 계산 메서드
            public static int gcd(int a, int b) {
                while (b != 0) {
                    int temp = b;
                    b = a % b;
                    a = temp;
                }
                return a;
            }

            // 최소 공배수(LCM) 계산 메서드
            public static int lcm(int a, int b) {
                return (a * b) / gcd(a, b);
            }

            // 메인 메서드
            public static void main(String[] args) {
                int a = 4;
                int b = 6;
                
                int result = lcm(a, b);
                System.out.println("최소 공배수: " + result);
            }
        }
    

5.1 코드 설명

위 코드의 동작 과정을 설명하겠습니다.

  1. gcd 메서드: 두 정수 a와 b를 입력받아 최대 공약수를 계산합니다. 유클리드 알고리즘을 사용해 효율적으로 GCD를 구합니다.
  2. lcm 메서드: 두 수의 최소 공배수를 구하는 메서드로, 앞서 설명한 GCD 공식을 적용합니다.
  3. main 메서드: 사용자가 입력한 두 수에 대해 최소 공배수를 계산하고 출력합니다.

6. 추가적인 예제와 테스트

이제 몇 가지 다른 입력에 대해서도 테스트해 보겠습니다. 다양한 테스트 케이스를 통해 코드의 신뢰성을 높일 수 있습니다.

예제 1

        입력: a = 15, b = 20
        출력: 60
    

예제 2

        입력: a = 9, b = 12
        출력: 36
    

예제 3

        입력: a = 7, b = 5
        출력: 35
    

7. 시간 복잡도 분석

위 알고리즘의 시간 복잡도는 다음과 같이 분석할 수 있습니다:

  • 최대 공약수를 구하는 gcd 메서드는 O(log(min(a, b)))의 시간 복잡도를 가집니다.
  • 따라서 전체 시간 복잡도는 O(log(min(a, b)))으로 매우 효율적입니다.

8. 결론

이번 강좌에서는 자바를 이용하여 최소 공배수를 구하는 알고리즘을 소개하였습니다. 알고리즘의 설계 뿐만 아니라, 구현 과정과 시간 복잡도 분석까지 다루었습니다. 코딩 테스트에서 자주 출제되는 문제이니 만큼 충분한 연습을 통해 실력을 키우길 바랍니다. 다음 강좌에서도 유용한 알고리즘을 다룰 예정이니 많은 기대 바랍니다!

자바 코딩테스트 강좌, 최소 공통 조상

이 글에서는 최소 공통 조상(LCA: Lowest Common Ancestor) 문제의 정의와 해결 방법을 자세히 살펴보겠습니다.

문제 정의

문제: 최소 공통 조상(Lowest Common Ancestor – LCA)

이진 트리에서 두 노드의 최소 공통 조상을 구하시오. 최소 공통 조상은 두 노드의 조상이면서 두 노드의 거리에서 가장 가까운 노드입니다.

예시로, 아래와 같은 이진 트리가 주어졌을 때:

                3
              /   \
             5     1
            / \   / \
           6   2 0   8
              / \
             7   4
        

노드 5와 노드 1의 최소 공통 조상은 3이고, 노드 5와 노드 4의 최소 공통 조상은 5입니다.

입력 형식

  • 이진 트리의 루트 노드와 두 개의 노드가 주어집니다.

출력 형식

  • 주어진 두 노드의 최소 공통 조상을 출력합니다.

문제 풀이

1. 문제 분석

주어진 이진 트리에서 두 노드의 최소 공통 조상을 찾기 위해서는 다음과 같은 두 가지 조건을 충족해야 합니다:

  • 노드 A의 조상인 노드 B가 존재해야 합니다.
  • 노드 C의 조상인 노드 B도 존재해야 합니다.

이러한 관계를 성립시키기 위해 이진 트리를 순회하며 각 노드에 대해 부모 노드를 추적할 수 있습니다.

2. 알고리즘 설계

우선, 이진 트리에서 특정 노드를 찾기 위해 DFS(Depth First Search) 또는 BFS(Breadth First Search)와 같은 탐색 기법을 사용할 수 있습니다.

최소 공통 조상을 찾기 위한 구체적인 알고리즘은 다음과 같습니다:

  1. 루트 노드부터 시작하여 트리를 탐색합니다.
  2. 양쪽 서브트리에서 주어진 두 노드를 찾습니다.
  3. 만약 각각의 서브트리에서 한 개의 노드를 찾으면 현재 노드가 최소 공통 조상입니다.
  4. 모두 찾지 못한 경우, null을 반환합니다.

3. 자바 코드 구현

public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int x) {
        val = x;
    }
}

public class LCA {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        // 베이스 케이스
        if (root == null || root == p || root == q) {
            return root;
        }

        // 왼쪽과 오른쪽 서브트리에서 LCA를 찾습니다.
        TreeNode left = lowestCommonAncestor(root.left, p, q);
        TreeNode right = lowestCommonAncestor(root.right, p, q);

        // 둘 다 찾은 경우, 현재 노드가 LCA입니다.
        if (left != null && right != null) {
            return root;
        }

        // 한쪽 서브트리에서 찾은 경우 그 결과를 반환합니다.
        return left != null ? left : right;
    }
}
    

4. 코드 설명

위의 코드에서 핵심 포인트는 다음과 같습니다:

  • 재귀적으로 호출하여 현재 노드가 null인지 또는 찾고자 하는 노드인지 확인합니다.
  • 왼쪽 및 오른쪽 서브트리에서 최소 공통 조상을 찾고, 둘 다 찾았다면 현재 노드를 반환합니다.
  • 끝으로 한쪽 서브트리에서만 발견한 경우 해당 노드를 반환하며, 그 외에는 null을 반환합니다.

5. 시간 복잡도

이 알고리즘의 시간 복잡도는 O(N)으로, 컬렉션의 각 노드를 한 번씩 방문하기 때문입니다. N은 트리의 노드 수입니다.

6. 공간 복잡도

공간 복잡도는 O(H)로, H는 트리의 높이입니다. 최악의 경우, 이진 트리가 한쪽으로 치우쳐 있을 경우 최대 높이는 N이 될 수 있습니다.

실전 코드 테스트

문제를 실제로 테스트하기 위해 예제 트리를 생성하고 LCA를 구하는 코드를 작성해 보겠습니다.

public class Main {
    public static void main(String[] args) {
        // 이진 트리 생성
        TreeNode root = new TreeNode(3);
        TreeNode node5 = new TreeNode(5);
        TreeNode node1 = new TreeNode(1);
        TreeNode node6 = new TreeNode(6);
        TreeNode node2 = new TreeNode(2);
        TreeNode node0 = new TreeNode(0);
        TreeNode node8 = new TreeNode(8);
        TreeNode node7 = new TreeNode(7);
        TreeNode node4 = new TreeNode(4);

        root.left = node5;
        root.right = node1;
        node5.left = node6;
        node5.right = node2;
        node1.left = node0;
        node1.right = node8;
        node2.left = node7;
        node2.right = node4;

        // LCA를 찾기 위한 객체 생성
        LCA lcaFinder = new LCA();
        TreeNode lca = lcaFinder.lowestCommonAncestor(root, node5, node1);
        System.out.println("LCA of 5 and 1: " + lca.val); // 출력: 3

        lca = lcaFinder.lowestCommonAncestor(root, node5, node4);
        System.out.println("LCA of 5 and 4: " + lca.val); // 출력: 5
    }
}
    

결론

이번 글에서는 이진 트리에서 최소 공통 조상을 찾는 문제를 다루며, 문제 정의, 알고리즘 설계, Java 코드 구현, 코드 테스트까지의 전 과정에 대해 설명하였습니다. 이 문제는 다양한 상황에서 응용될 수 있으며, 알고리즘 및 데이터 구조의 기초적인 개념을 이해하는 데 큰 도움이 됩니다.

이를 통해 자바로 코딩테스트를 준비하는 데 유용한 알고리즘 패턴을 익힐 수 있으며, 문제 해결 능력을 키우는 데 기여할 것입니다.