Pink Spider/코딩 테스트 합격자 되기(자바편) - 30. 간단한 유니온 파인드 알고리즘 구현하기

Created Mon, 29 Dec 2025 09:37:03 +0900 Modified Mon, 29 Dec 2025 09:39:01 +0900
965 Words 4 min

import java.util.ArrayList;

// 30. 간단한 유니온 파인드 알고리즘 구현하기
public class Solution30 {

    private static int[] parent;

    private static int findRootNode(int x) {
        if (parent[x] == x) {
            return x;
        }
        parent[x] = findRootNode(parent[x]);
        return parent[x];
    }

    private static void union(int x, int y) {
        int root1 = findRootNode(x);
        int root2 = findRootNode(y);
        parent[root2] = root1;
    }

    public static Boolean[] solution(int k, int[][] operations) {

        parent = new int[k];

        for (int i = 0; i < k; i++) {
            parent[i] = i;
        }

        ArrayList<Boolean> answer = new ArrayList<>();

        for (int[] op : operations) {
            if (op[0] == 0) {
                union(op[1], op[2]);
            }
            else {
                answer.add(findRootNode(op[1]) == findRootNode(op[2]));
            }
        }

        return answer.toArray(new Boolean[0]);
    }
}

코드에서 return answer.toArray(new Boolean[0]); 구문은 ArrayList<Boolean> 타입인 answerBoolean[] 배열로 변환하여 반환하는 역할을 합니다.

각 부분의 상세한 의미는 다음과 같습니다.

1. answer.toArray(...)의 역할

  • ArrayList와 같은 컬렉션(List)을 일반 **배열(Array)**로 변환하는 메서드입니다.
  • 만약 인자 없이 그냥 answer.toArray()를 사용하면, 반환 타입은 Object[]가 됩니다. 하지만 이 메서드의 반환 타입은 Boolean[]이어야 하므로, 구체적인 타입을 지정해 주어야 합니다.

2. new Boolean[0]의 의미 (Type Hint)

이 부분은 두 가지 중요한 역할을 수행합니다.

  1. 타입 지정 (Type Safety):
  • Java의 제네릭(Generics) 특성상, 런타임에는 ArrayList가 내부적으로 어떤 타입을 담고 있는지 정보가 사라지는 경우(Type Erasure)가 있습니다.
  • 따라서 toArray 메서드에게 **“나는 Boolean[] 타입의 배열을 원해”**라고 알려주는 역할을 합니다.
  1. 크기 자동 할당:
  • new Boolean[0]으로 크기가 0인 빈 배열을 넘겨주면, 자바 내부적으로 리스트(answer)의 크기(size)를 확인합니다.
  • 리스트의 크기가 0보다 크다면, 넘겨받은 배열(크기 0)을 무시하고 리스트 크기에 딱 맞는 새로운 Boolean 배열을 메모리에 할당하여 데이터를 채운 뒤 반환합니다.

3. 왜 하필 [0]인가요?

과거에는 new Boolean[answer.size()] 처럼 리스트 크기를 미리 계산해서 넘겨주는 것이 빠르다고 여겨졌습니다. 하지만 최신 JVM(Java Virtual Machine)에서는 빈 배열([0])을 넘겨주는 것이 최적화가 더 잘 되어 있어 권장되는 방식입니다.

요약

“리스트(answer)에 들어있는 데이터들을 Boolean 타입의 배열로 바꿔서 줘. 배열의 크기는 네가 리스트 크기에 맞춰서 알아서 새로 만들어.”

라는 의미입니다.


비교 예시

1. 잘못된 방식 (컴파일 에러 혹은 형변환 불가)

// 반환 타입이 Object[]라서 Boolean[] 변수에 담을 수 없음
return answer.toArray(); 

2. 과거의 방식 (크기 지정)

// 동작은 하지만 코드가 길어지고, 최신 자바에서는 굳이 필요 없음
return answer.toArray(new Boolean[answer.size()]);

3. 권장 방식 (현재 코드)

// 깔끔하고 성능상으로도 유리함
return answer.toArray(new Boolean[0]);