본문 바로가기

백준 문제 풀이

백준 3584번 가장 가까운 공통 조상 (C++)

728x90

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

 

3584번: 가장 가까운 공통 조상

루트가 있는 트리(rooted tree)가 주어지고, 그 트리 상의 두 정점이 주어질 때 그들의 가장 가까운 공통 조상(Nearest Common Anscestor)은 다음과 같이 정의됩니다. 두 노드의 가장 가까운 공통 조상은, 두

www.acmicpc.net

 

 우선 이 문제를 처음 접했을 때, 난 LCA알고리즘의 존재를 모르고 풀었다. 때문에 이 풀이가 100퍼센트 맞는 정답이라고는 말할 수 없다. 하지만 코딩테스트에서 모르는 알고리즘이 나와도 풀이할 수 있어야한다.

LCA에 대해서는 다음 포스팅에 할 예정이다.

 

각 자식들은 단 하나의 부모를 가지고 있다.

 

먼저 A의 조상을 타고 올라간다. 그렇다면 루트노드까지 쭉 타고 올라갈 것이다. 그 후 B부터 루트까지 타고 올라간다. 이 때 A의 조상은 방문표시가 되어있을 것이니 B가 타고 올라가다가 이미 방문한 노드를 발견한다면 그 노드가 공통 조상이다. 

 

#include <iostream>
#include <vector>
using namespace std;

vector<int> node[10001];
bool visited[10001];
int T, N;
int A, B;

void solution_first(int N) {	
	visited[N] = true;
	if (node[N].size() == 0) return;

	int nextNode = node[N][0];
	
	solution_first(nextNode);
}

int solution_second(int N) {
	if (visited[N] == true) return N;
	
	int nextNode = node[N][0];	

	if (visited[nextNode] == true) return nextNode;
	return solution_second(nextNode);
}

void init() {
	for (int i = 0; i < 10001; i++) {
		visited[i] = false;
		node[i].clear();
	}
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cin >> T;
	for (int i = 0; i < T; i++) {
		init();

		cin >> N;
	
		for (int i = 0; i < N - 1; i++) {
			int s, e;
			cin >> s >> e;
			node[e].push_back(s);
		}
		cin >> A >> B;
		solution_first(A);
		int answer = solution_second(B);

		cout << answer << '\n';
	}
}

 

'백준 문제 풀이' 카테고리의 다른 글

백준 11438번 LCA 2 (C++)  (0) 2023.12.13
백준 16562번 친구비(C++)  (1) 2023.12.12
백준 1107번 리모컨 (C++)  (0) 2023.12.08
백준 11000번 강의실 배정 (C++)  (2) 2023.12.05
백준 2457번 공주님의 정원 (C++)  (1) 2023.12.05