[Algorithm] ๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ง๋ฐฑ์ค€ 3584 ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ณตํ†ต ์กฐ์ƒ

HaJingJingยท2021๋…„ 5์›” 28์ผ
0

Algorithm

๋ชฉ๋ก ๋ณด๊ธฐ
53/119

0. ๋ฌธ์ œ

๋ฃจํŠธ๊ฐ€ ์žˆ๋Š” ํŠธ๋ฆฌ(rooted tree)๊ฐ€ ์ฃผ์–ด์ง€๊ณ , ๊ทธ ํŠธ๋ฆฌ ์ƒ์˜ ๋‘ ์ •์ ์ด ์ฃผ์–ด์งˆ ๋•Œ ๊ทธ๋“ค์˜ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ณตํ†ต ์กฐ์ƒ(Nearest Common Anscestor)์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋ฉ๋‹ˆ๋‹ค.

* ๋‘ ๋…ธ๋“œ์˜ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ณตํ†ต ์กฐ์ƒ์€, ๋‘ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ์ž์†์œผ๋กœ ๊ฐ€์ง€๋ฉด์„œ ๊นŠ์ด๊ฐ€ ๊ฐ€์žฅ ๊นŠ์€(์ฆ‰ ๋‘ ๋…ธ๋“œ์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด) ๋…ธ๋“œ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด 15์™€ 11๋ฅผ ๋ชจ๋‘ ์ž์†์œผ๋กœ ๊ฐ–๋Š” ๋…ธ๋“œ๋Š” 4์™€ 8์ด ์žˆ์ง€๋งŒ, ๊ทธ ์ค‘ ๊นŠ์ด๊ฐ€ ๊ฐ€์žฅ ๊นŠ์€(15์™€ 11์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด) ๋…ธ๋“œ๋Š” 4 ์ด๋ฏ€๋กœ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ณตํ†ต ์กฐ์ƒ์€ 4๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๋ฃจํŠธ๊ฐ€ ์žˆ๋Š” ํŠธ๋ฆฌ๊ฐ€ ์ฃผ์–ด์ง€๊ณ , ๋‘ ๋…ธ๋“œ๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ ๊ทธ ๋‘ ๋…ธ๋“œ์˜ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ณตํ†ต ์กฐ์ƒ์„ ์ฐพ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์„ธ์š”

์ž…๋ ฅ
์ฒซ ์ค„์— ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜ T๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋งˆ๋‹ค, ์ฒซ์งธ ์ค„์— ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋…ธ๋“œ์˜ ์ˆ˜ N์ด ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. (2 โ‰ค N โ‰ค 10,000)

๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋‹ค์Œ N-1๊ฐœ์˜ ์ค„์— ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐ„์„  ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ํ•œ ๊ฐ„์„  ๋‹น ํ•œ ์ค„์— ๋‘ ๊ฐœ์˜ ์ˆซ์ž A B ๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง€๋Š”๋ฐ, ์ด๋Š” A๊ฐ€ B์˜ ๋ถ€๋ชจ๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค. (๋‹น์—ฐํžˆ ์ •์ ์ด N๊ฐœ์ธ ํŠธ๋ฆฌ๋Š” ํ•ญ์ƒ N-1๊ฐœ์˜ ๊ฐ„์„ ์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค!) A์™€ B๋Š” 1 ์ด์ƒ N ์ดํ•˜์˜ ์ •์ˆ˜๋กœ ์ด๋ฆ„ ๋ถ™์—ฌ์ง‘๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๋งˆ์ง€๋ง‰ ์ค„์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ณตํ†ต ์กฐ์ƒ์„ ๊ตฌํ•  ๋‘ ๋…ธ๋“œ๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.

์ถœ๋ ฅ
๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๋ณ„๋กœ, ์ฒซ ์ค„์— ์ž…๋ ฅ์—์„œ ์ฃผ์–ด์ง„ ๋‘ ๋…ธ๋“œ์˜ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ณตํ†ต ์กฐ์ƒ์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

1. ์•„์ด๋””์–ด

๐Ÿ’ก ์ฃผ์–ด์ง„ ์ˆซ์ž์˜ depth๋ฅผ ๊ตฌํ•จ
๐Ÿ’ก depth๊ฐ€ ๋‹ค๋ฅด๋‹ค๋ฉด, ํฐ ์ˆซ์ž๊ฐ€ ๋ถ€๋ชจ๋…ธ๋“œ๋กœ ์˜ฌ๋ผ๊ฐ€ depth๊ฐ€ ๊ฐ™์•„์ง€๊ฒŒ ํ•จ
๐Ÿ’ก depth๊ฐ€ ์„œ๋กœ ๊ฐ™๋‹ค๋ฉด, ๊ฐ™์€ ์ˆซ์ž๊ฐ€ ๋‚˜์˜ฌ๋•Œ๊นŒ์ง€ ๋ถ€๋ชจ๋…ธ๋“œ๋กœ ์˜ฌ๋ผ๊ฐ

2. ํ•ต์‹ฌ ํ’€์ด

1) ์ฃผ์–ด์ง„ ์ˆซ์ž์˜ depth๋ฅผ ๊ตฌํ•จ

static int depth(int node) {
	int dep = 0;
	int cur = node;
		
	while(cur != 0) {
		dep++;
		cur = parent[cur];
	}
		
	return dep-1;
}

2) depth๊ฐ€ ๋‹ค๋ฅด๋‹ค๋ฉด, ํฐ ์ˆซ์ž๊ฐ€ ๋ถ€๋ชจ๋…ธ๋“œ๋กœ ์˜ฌ๋ผ๊ฐ€ depth๊ฐ€ ๊ฐ™์•„์ง€๊ฒŒ ํ•จ

if(aDepth > bDepth) {
	while(aDepth != bDepth) {
		aDepth--;
		a = parent[a];
	}
} else if(bDepth > aDepth) {
	while(bDepth != aDepth) {
		bDepth--;
		b = parent[b];
	}
}

3) depth๊ฐ€ ์„œ๋กœ ๊ฐ™๋‹ค๋ฉด, ๊ฐ™์€ ์ˆซ์ž๊ฐ€ ๋‚˜์˜ฌ๋•Œ๊นŒ์ง€ ๋ถ€๋ชจ๋…ธ๋“œ๋กœ ์˜ฌ๋ผ๊ฐ

while(a!=b) {
	a = parent[a];
	b = parent[b];
}

3. ์ฝ”๋“œ

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Graph_4 {
	static int[] parent;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(br.readLine());
		
		while(T-->0) {
			int N = Integer.parseInt(br.readLine());
			
			parent = new int[N+1];
			String[] s;
			
			for(int i=0; i<N-1; i++) {
				s = br.readLine().split(" ");
				parent[Integer.parseInt(s[1])] = Integer.parseInt(s[0]);
			}
			
			s = br.readLine().split(" ");
			int a = Integer.parseInt(s[0]);
			int b = Integer.parseInt(s[1]);
			
			int aDepth = depth(a);
			int bDepth = depth(b);
			
			System.out.println(find(a,b,aDepth,bDepth));
			
		}
		
	}
	
	static int depth(int node) {
		int dep = 0;
		int cur = node;
		
		while(cur != 0) {
			dep++;
			cur = parent[cur];
		}
		
		return dep-1;
	}
	
	static int find(int a, int b, int aDepth, int bDepth) {
		if(aDepth > bDepth) {
			while(aDepth != bDepth) {
				aDepth--;
				a = parent[a];
			}
		} else if(bDepth > aDepth) {
			while(bDepth != aDepth) {
				bDepth--;
				b = parent[b];
			}
		}
		
		while(a!=b) {
			a = parent[a];
			b = parent[b];
		}
		
		return a;
	}
}

4. ๊ฒฐ๊ณผ

์„ฑ๊ณตโœจ

profile
๐ŸŒฑ์ดˆ๋ณด ๊ฐœ๋ฐœ์ž๐ŸŒฑ

0๊ฐœ์˜ ๋Œ“๊ธ€