티스토리 뷰
가장 가까운 공통 조상 찾기
문제
트리의 노드 X에 대하여 “조상"을 정의할 수 있다. X의 “조상"이란, 루트까지 올라가는 중에 만나는 모든 노드를 말한다. 예를 들어, 아래와 같이 트리가 주어질 경우, 노드 8의 “조상"은 노드 0, 노드 2, 노드 6이 된다.
두 노드 X, Y의 공통 조상이란, X와 Y가 공통으로 갖는 조상을 말한다. 예를 들어, 노드 7과 노드 10의 공통조상은 노드 2, 노드 0이 된다. 가장 가까운 공통 조상이란, X와 Y가 공통으로 갖는 조상들 중에서 X, Y와 가장 가까운 조상을 말한다. 예를 들어, 노드 7과 노드 10의 가장 가까운 공통 조상은 노드 2가 된다. 트리가 주어지고, 두 노드 X, Y가 주어질 때, 가장 가까운 공통 조상을 찾는 프로그램을 작성하시오.
입력
첫 번째 줄에 트리의 노드 개수 n, 두 노드 X, Y의 번호가 주어진다. ( 1 ≤ X, Y ≤ n ≤ 1000 ) 두 번째 줄부터 트리의 간선 정보가 주어진다. 각 줄은 2개의 숫자 a, b로 이루어지며, 이는 노드 a가 노드 b의 부모노드라는 것을 의미한다. 루트는 노드 0이라고 가정한다.
출력
두 노드 X, Y의 공통 조상을 출력한다.
예제 입력
11 7 10
0 1
0 2
1 3
1 4
1 5
2 6
2 10
6 7
6 8
6 9
예제 출력
2
코드 / 힌트 - 자기자신도 조상후보 중 하나로 놔야한다.
//공통조상찾기
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static ArrayList<Node> box = new ArrayList<>();
public static ArrayList<Node> fatherBox = new ArrayList<>();
public static ArrayList<Node> fatherBox2 = new ArrayList<>();
public static int count = 0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//총 몇개의 숫자를 입력 받을 것인지
int a;
int b;
int b2;
int c = 0;
int d = 0;
int result = 0;
a = sc.nextInt();
for (int i = 0; i < a; i++) {
Node node = new Node(i);
box.add(node);
}
b = sc.nextInt();
b2 = sc.nextInt();
for (int i = 1; i < a; i++) {
c = sc.nextInt();
d = sc.nextInt();
box.get(c).getNodes().add(box.get(d));
box.get(d).setFather(box.get(c));
}
Node find1 = box.get(b);
Node find2 = box.get(b2);
fatherBox.add(find1);
fatherBox2.add(find2);
while (find1.getData() != 0 || find2.getData() != 0) {
if (find1.getData() != 0) {
fatherBox.add(find1.getFather());
find1 = find1.getFather();
}
if (find2.getData() != 0) {
fatherBox2.add(find2.getFather());
find2 = find2.getFather();
}
}
fullFor:
for (int i = 0; i < fatherBox.size(); i++) {
for (int j = 0; j < fatherBox2.size(); j++) {
if (fatherBox.get(i).getData() == fatherBox2.get(j).getData()) {
result = fatherBox.get(i).getData();
break fullFor;
}
}
}
System.out.println(result);
}
}
class Node {
private boolean isChecked;
private int data;
private Node father;
private ArrayList<Node> nodes;
public Node getFather() {
return father;
}
public void setFather(Node father) {
this.father = father;
}
public boolean isChecked() {
return isChecked;
}
public void setChecked(boolean checked) {
isChecked = checked;
}
public Node(int data) {
this.setChecked(false);
this.data = data;
this.father = null;
nodes = new ArrayList<>();
}
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
public ArrayList<Node> getNodes() {
return nodes;
}
public void setNodes(ArrayList<Node> nodes) {
this.nodes = nodes;
}
}
'알고리즘 문제 풀이 ' 카테고리의 다른 글
이분그래프 (0) | 2018.09.27 |
---|---|
2색 칠하기 (0) | 2018.09.27 |
트리의 거리 (0) | 2018.09.27 |
트리의 높이 (1) | 2018.09.27 |
깊이우선탐색 / 너비우선탐색 (0) | 2018.09.27 |
부등호 (0) | 2018.09.20 |
좋은 수열 찾기 (0) | 2018.09.18 |
이진 트리 순회 (0) | 2018.09.18 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- java #오르막수 #백준 #알고리즘
- 백준 #java #알고리즘
- java #알고리즘 #백준
- java #퀵소트 #quicksort #알고리즘 #백준
- java #백준 #알고리즘 #2805 #나무자르기
- javascript #백준 #알고리즘 #LCS
- java #백준 #알고리즘 #로또 #6603
- 백준 #알고리즘 #전깃줄 #NodeJs #javascript
- react
- 2630번
- 중간거리 #야만나 #약속장소추천 #중간위치 #웹 #리액트 #React #reactjs #kakao지도 #kakaoapi
- 1992번
- java #알고리즘 #백준 #패션왕신해빈
- java #하노이 #알고리즘 #백준
- Game
- webpack
- 백준
- npm
- javascript #백준 #회의실배정 #알고리즘
- Javascript
- java #알고리즘 #백준 #N과M #백트래킹
- TypeScript
- Terminal
- java #알고리즘 #백준 #퇴사
- 알고리즘
- 한글 자동 완성
- webspider
- javascript #연속합 #알고리즘 #백준
- 색종이자르기
- 쿼드트리
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
글 보관함