Hello Ocean! ๐ŸŒผ

[๋ฐฑ์ค€/C++] 3584. ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ณตํ†ต์กฐ์ƒ ๋ณธ๋ฌธ

Algorithm

[๋ฐฑ์ค€/C++] 3584. ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ณตํ†ต์กฐ์ƒ

bba_dda 2021. 7. 6. 20:57
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

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

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

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

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

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

 

ํ’€์ด

์ž…๋ ฅ๋œ ํŠธ๋ฆฌ์˜ ๊ด€๊ณ„?๋ฅผ 

parent[idx]์— ์ €์žฅํ–ˆ๋‹ค. 

-> parent[idx] = idx์˜ ๋ถ€๋ชจ ๋ฒˆํ˜ธ 

 

๋…ธ๋“œ๋ฒˆํ˜ธ๊ฐ€ 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•จ์œผ๋กœ, parent[idx] == 0์ธ ๋…ธ๋“œ๊ฐ€ ๋ฃจํŠธ ๋…ธ๋“œ์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. 

 

์ด๋ ‡๊ฒŒ ์ €์žฅํ•œ ํ›„์—, ์ž…๋ ฅ๋œ ๋‘ ๋…ธ๋“œ A, B์— ๋Œ€ํ•ด 

์ž์‹ ๋ถ€ํ„ฐ ~ ๋ฃจํŠธ๊นŒ์ง€ ๋ถ€๋ชจ๋ฅผ ๊ณ„์† ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€๋ฉฐ ๋ฒกํ„ฐ์— ์ €์žฅํ–ˆ๋‹ค. 

(parent[idx] == 0์ผ ๋•Œ ๊นŒ์ง€ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ) 

 

๊ทธ ๋‹ค์Œ์—, A๋กœ ๋งŒ๋“  ๋ฒกํ„ฐ์™€ B๋กœ ๋งŒ๋“  ๋ฒกํ„ฐ์˜ ๊ฐ’์„ ๋น„๊ตํ•˜๋ฉฐ, ๊ฐ€์žฅ ๋จผ์ € ๊ฐ™์€ ๋…ธ๋“œ?๋ฒˆํ˜ธ?๊ฐ€ ๋‘ ๋…ธ๋“œ์˜ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ณตํ†ต์กฐ์ƒ์ด๋‹ค. 

 

* ๋ฒกํ„ฐ์— ๋ถ€๋ชจ๋ฅผ ์ €์žฅํ•  ๋•Œ, ์ž๊ธฐ ๋ถ€๋ชจ๋ถ€ํ„ฐ ๋„ฃ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ž๊ธฐ ์ž์‹ ๋ถ€ํ„ฐ ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. 

์ฝ”๋“œ

#include <iostream>
#include <vector>

using namespace std;


int main() {
	int T,N;
	cin >> T;
	for (int t = 0;t < T;t++) {
		cin >> N;
		vector<int> my_parent(10001, 0);
		for (int n = 0;n < N-1;n++) {
			int A, B;
			cin >> A >> B;
			my_parent[B] = A;
		}
		int a, b;
		cin >> a >> b;
		// ๋ฃจํŠธ๊นŒ์ง€ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€๊ธฐ 
		vector<int> _a; //A ~ ๋ฃจํŠธ๊นŒ์ง€ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€๋Š” ๊ฒฝ๋กœ ์ €์žฅ 
		vector<int> _b; //B ~ ๋ฃจํŠธ๊นŒ์ง€ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€๋Š” ๊ฒฝ๋กœ ์ €์žฅ 
		int now = a;
		while (now != 0) {
			_a.push_back(now);
			now = my_parent[now];
		}
		now = b;
		while (now != 0) {
			_b.push_back(now);
			now = my_parent[now];
		}

		// ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ณตํ†ต ์กฐ์ƒ ์ฐพ๊ธฐ 
		bool isFind = false;
		for (int i = 0;i < _a.size();i++) {
			if (isFind) break;
			for (int j = 0;j < _b.size();j++) {
				if (_a[i] == _b[j]) {
					cout << _a[i] << endl;
					isFind = true;
					break;
				}
			}
		}
	}

}

๊ฒฐ๊ณผ

 

๋ฐ˜์‘ํ˜•