์ต์ ๊ณตํต ์กฐ์ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ
โ ๋ ์ ์ ์ด ๋ง๋๋ ์ต์ด ๋ถ๋ชจ ์ ์ ์ ์ฐพ๋ ๊ฒ!
ํธ๋ฆฌ ํ์์ด ์๋์ ๊ฐ์ด ์ฃผ์ด์ก๋ค๊ณ ํ์
4์ 5์ LCA๋? โ 4์ 5์ ์ฒซ ๋ถ๋ชจ ์ ์ ์ '2'
4์ 6์ LCA๋? โ ์ฒซ ๋ถ๋ชจ ์ ์ ์ root์ธ '1'
์ด๋ป๊ฒ ์ฐพ์ฃ ?
ํด๋น ์ ์ ์ depth์ parent๋ฅผ ์ ์ฅํด๋๋ ๋ฐฉ์์ด๋ค. ํ์ฌ ๊ทธ๋ฆผ์์์ depth๋ ์๋์ ๊ฐ์ ๊ฒ์ด๋ค.
[depth : ์ ์ ]
0 โ 1(root ์ ์ )
1 โ 2, 3
2 โ 4, 5, 6, 7
parent๋ ์ ์ ๋ง๋ค ๊ฐ์ง๋ ๋ถ๋ชจ ์ ์ ์ ์ ์ฅํด๋๋ค. ์์ ์์์์ ์ ์ฅ๋ parent ๋ฐฐ์ด์ ์๋์ ๊ฐ๋ค.
// 1 ~ 7๋ฒ ์ ์ (root๋ ๋ถ๋ชจ๊ฐ ์๊ธฐ ๋๋ฌธ์ 0)
int parent[] = {0, 1, 1, 2, 2, 3, 3}
์ด์
์ด ๋ ๋ฐฐ์ด์ ํ์ฉํด์ ๋ ์ ์ ์ด ์ฃผ์ด์ก์ ๋ LCA๋ฅผ ์ฐพ์ ์ ์๋ค. ๊ณผ์ ์ ์๋์ ๊ฐ๋ค.
// ๋ ์ ์ ์ depth ํ์ธํ๊ธฐ
while(true){
if(depth๊ฐ ์ผ์น)
if(๋ ์ ์ ์ parent ์ผ์น?) LCA ์ฐพ์(์ข
๋ฃ)
else ๋ ์ ์ ์ ์์ ์ parent ์ ์ ๊ฐ์ผ๋ก ๋ณ๊ฒฝ
else // depth ๋ถ์ผ์น
๋ depth๊ฐ ๊น์ ์ ์ ์ ํด๋น ์ ์ ์ parent ์ ์ ์ผ๋ก ๋ณ๊ฒฝ(depth๊ฐ ๊ฐ์๋จ)
}
ํธ๋ฆฌ ๋ฌธ์ ์์ ๊ณตํต ์กฐ์์ ์ฐพ์์ผํ๋ ๋ฌธ์ ๋, ์ ์ ๊ณผ ์ ์ ์ฌ์ด์ ์ด๋๊ฑฐ๋ฆฌ ๋๋ ๋ฐฉ๋ฌธ๊ฒฝ๋ก๋ฅผ ์ ์ฅํด์ผ ํ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ฉด ๋๋ค.