코딩 테스트는 많은 기업에서 필수적으로 요구하는 과정이며, 특히 데이터 구조와 알고리즘에 대한 이해는 핵심 역량으로 자리 잡고 있습니다. 이 글에서는 트리 구조와 그 부모 노드를 찾는 문제를 다룰 것입니다. 이 문제의 중요성과 해결 방법, 그리고 자바로 해결하는 과정을 상세히 설명하도록 하겠습니다.
문제 설명
트리 구조는 노드의 계층적 관계를 나타내는 자료구조입니다. 각 노드는 자식 노드를 가질 수 있으며, 이와 같이 간단한 구조 속에서도 다양한 문제가 발생할 수 있습니다. 이번 문제에서는 주어진 노드의 부모 노드를 찾는 것입니다.
문제 정의
주어진 트리와 특정 노드의 값을 입력받아 해당 노드의 부모 노드를 반환하는 프로그램을 작성하시오. 만약 입력된 노드가 루트 노드이거나 존재하지 않는 경우에는 -1
을 반환해야 합니다.
입력 형식
첫 번째 줄: 노드의 개수 (1 ≤ N ≤ 100,000)
두 번째 줄: 각 노드의 부모 노드 정보 (공백으로 구분된 정수로 나타냄)
세 번째 줄: 찾고자 하는 노드
출력 형식
부모 노드의 값 또는 -1
문제 해결 접근 방식
우리는 주어진 트리의 부모 노드를 빠르게 찾기 위해 몇 가지 방법을 사용할 수 있습니다. 주로 사용하는 방법은 배열을 통한 접근입니다. 부모 노드 정보를 배열로 저장하면, 특정 노드의 부모를 상수 시간에 찾을 수 있습니다. 이 과정은 다음과 같습니다:
1. 데이터 구조 선택
노드의 부모 정보를 효과적으로 저장하기 위해, 우리는 배열을 사용할 것입니다. 배열의 인덱스가 노드의 값에 해당하고, 각 인덱스에 저장된 값이 부모 노드의 값입니다. 예를 들어, 노드의 부모 정보가 다음과 같다면:
[-1, 0, 0, 1, 1, 2]
위 배열에서:
- 노드 0의 부모: -1 (루트 노드)
- 노드 1의 부모: 0
- 노드 2의 부모: 0
- 노드 3의 부모: 1
- 노드 4의 부모: 1
- 노드 5의 부모: 2
2. 알고리즘 설계
이제 알고리즘을 설계합니다. 전체 과정은 다음과 같습니다:
- 부모 정보를 저장할 배열을 초기화합니다.
- 부모 정보 배열을 입력받습니다.
- 찾고자 하는 노드를 입력받습니다.
- 입력된 노드가 배열의 범위 내에 있는지 확인합니다.
- 부모 노드를 찾고 반환합니다.
- 부모 노드가 루트 노드일 경우 -1을 반환합니다.
자바 코드 구현
이제 위에서 설명한 알고리즘을 자바로 구현해 보도록 하겠습니다. 우선 필요한 클래스를 정의하고, 메인 메서드를 작성하겠습니다:
import java.util.Scanner;
public class FindParentNode {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 노드의 개수 입력
int n = sc.nextInt();
int[] parents = new int[n];
// 부모 정보 입력
for (int i = 0; i < n; i++) {
parents[i] = sc.nextInt();
}
// 찾고자 하는 노드 입력
int target = sc.nextInt();
// 부모 노드 찾기
int result = findParent(parents, target);
System.out.println(result);
sc.close();
}
// 부모 노드 찾기 메서드
public static int findParent(int[] parents, int node) {
if (node < 0 || node >= parents.length) {
return -1; // 존재하지 않는 노드
}
// 부모 노드 반환
return parents[node];
}
}
설명
위 코드에서, 우리는 Scanner
클래스를 사용하여 입력을 받고, parents
배열에 부모 정보를 저장합니다. 나중에 목표 노드를 입력받고, findParent
메서드를 호출하여 부모 노드를 찾습니다. 이 메서드는 입력된 노드가 유효한지 확인 후, 해당 노드의 부모를 반환합니다.
테스트 케이스
이제 구현된 코드가 올바르게 작동하는지 확인하기 위해 몇 가지 테스트 케이스를 만들어 보겠습니다.
테스트 케이스 1
입력:
6
-1 0 0 1 1 2
3
출력:
1
테스트 케이스 2
입력:
6
-1 0 0 1 1 2
0
출력:
-1
테스트 케이스 3
입력:
6
-1 0 0 1 1 2
6
출력:
-1
결론
이번 포스팅을 통해 자바로 트리의 부모 노드를 찾는 문제를 해결하는 과정을 살펴보았습니다. 트리 구조는 데이터 구조의 기본 개념 중 하나이며, 기본적인 부모-자식 관계를 이해했으므로 다른 복잡한 트리 문제를 해결하는데도 유용할 것입니다. 코딩 테스트에 대비하기 위해 여러 가지 문제를 풀어보고 자신만의 풀이 과정을 만들어 나가기를 바랍니다.