๐จโ๐ป ์ค๋ ๊ณต๋ถํ ๊ฒ
BFS์ ๊ตฌํํด๋ณด์๋ค. (๋๋ ์ด๋ ค์ด ๊ฒ..)
const result = getDirections(
[
[0, 1, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1],
[0, 1, 0, 0],
],
0,
2
);
console.log(result); // true
๋ค์๊ณผ ๊ฐ์ด ์ถ๋ ฅ๊ฐ์ด ๋์ค๊ธฐ์ํด ๊ตฌ์ฑํ ์ฃผ์์ฝ๋๋ค์ด๋ค. ์์ ๋ง์ ์ธ์ด๋ก ์๊ธฐํ ์ ์์ด์ผํ๋ค๊ณ ์๊ฐํด์
์ฌ๋ฌ์ฐจ๋ก์ ๊ฑฐ์ณ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ ์ ์ฃผ์์ผ๋ก ์ ๋ฆฌํด ๋ณด์๋ค.
// ์ฒซ๋ฒ์งธ
// bfs(breath first search)
// queue
// queue์ ์ฒซ๋ฒ์งธ vertex๋ฅผ ํธ์ฌํจ
// ๋ฐฉ๋ฌธ์ ํ๋์ง์ ๋ํ booleanํ์
์์๋ก ๊ฐ์ง ๋ฐฐ์ด isVisited๋ฅผ ์ ์ธ
// ์ฒซ๋ฒ์งธ vertex๋ ๋ฐฉ๋ฌธ์ด ๋์์ผ๋, isVisited[vertex] = true; ๋ฅผ ํ ๋น
// ํ์ ๊ธธ์ด๊ฐ 0์ด๋ฉด while๋ฌธ ๋ฉ์ถ๋ค. ํ์ ๊ธธ์ด๊ฐ 0์ผ๋๋ ๋์ด์ ๊ฐ์ ์ด ์ฐ๊ฒฐ์ด ์๋์์ด์ ๊ฐ๋ฐ๊ฐ ์๋ ๊ฒ์ด๋ค.
// adjacency matrix[index]์์ adjacency matrix[index]๋ฅผ ๋ค ๋๋ฉด์
// if(adjacency matrix[index][i] === 1 && isVisited[i] === false);
// ์ฆ index ๋ ํ์ฌ vertex from๋ฅผ ์๋ฏธํ๊ณ , i ๋ to๋ฅผ ์๋ฏธํ๋ค.
// ๊ทธ๋์ from์์ to๋ฅผ ๊ฐ ์ ์๊ณ , ์์ง ๋ฐฉ๋ฌธ์ ์ํ๋ค๋ฉด queue์ push๋ฅผ ํ๊ณ ๋ฐฉ๋ฌธ์ ํ๋ค๋ ์๋ฏธ๋ก isVisited[i]์ true๋ฅผ
// ํ ๋นํ๋ค.
// ๊ทธ๋ฆฌ๊ณ
// ๋๋ฒ์งธ
// adjacency matrix๋ฅผ input์ผ๋ก ๋ฐ์์ from vertex์์ to vertex๊น์ง ๊ฐ ์ ์๋ ์ง ๋ถ๋ฆฐํ์
์ ๋ฆฌํดํ๋ผ.
// ํ๋ฅผ ์ ์ธํ๊ณ from์ ํธ์ฌํ๋ค.
// from vertex๋ฅผ ๋ฐฉ๋ฌธํ์ผ๋ vertex๋ฅผ ๋งํฌ์ฒ๋ฆฌํด์ค๋ค.
// ์ด์ ์์
// ํ์ ๋ค์ด๊ฐ ๋
ธ๋๋ฅผ ๊บผ๋ด๊ณ ๊ทธ ๋
ธ๋์ ์์ ๋
ธ๋๋ค์ด ์์ง ๋ฐฉ๋ฌธ๋์ง์์๋ค๋ฉด, ๋งํฌ์ฒ๋ฆฌ๊ฐ ๋์ง์์๋ค๋ฉด ํ์ ํธ์ฌํด์ค๋ค.
// ๊ทธ๋ฆฌ๊ณ ํ์ ํธ์ฌ๋ ๋
ธ๋๋ค์ ๋ฐฉ๋ฌธ์ด ๋์๋ค๊ณ ๋งํฌ์ฒ๋ฆฌํด์ค๋ค.
// ํ์์ ๋
ธ๋๋ฅผ ๊บผ๋ธ๋ค. ๊บผ๋ธ ๋
ธ๋๋ ์ถ๋ ฅํ๊ณ ๊บผ๋ธ ๋
ธ๋์ ์์๋
ธ๋๋ค์ด ๋งํฌ์ฒ๋ฆฌ, ๋ฐฉ๋ฌธ์ด, ์ํ๊ฐ ๋์ง ์์๋ค๋ฉด ํ์ ํธ์ฌํด์ฃผ๊ณ
// ๋ฐฉ๋ฌธ, ์ํ๊ฐ ๋์๋ค๊ณ ๋งํฌ์ฒ๋ฆฌํด์ค๋ค. ๊ทธ๋์ ๋ชจ๋ ๋
ธ๋๊ฐ ๋ฐฉ๋ฌธ์ด ๋์ด ๋์ด์ ํ์ ๋ค์ด๊ฐ vertex๊ฐ ์์๊ฒฝ์ฐ ์ํ, ํ๋ก๊ทธ๋จ
// ์ ์ข
๋ฃํด์ค๋ค.
// ์ธ๋ฒ์งธ
// ํ๋ฅผ ์์ฑํ๊ณ ์์ฑํ ํ์ from์ ๋ฐฐ์ด์ ์์๋ก ํ ๋นํ๋ค.
// from vertex๊ฐ ์กฐํ๋์๋ค๊ณ ๋ฐ๋ก ๋ฐฐ์ด์ ๋ง๋ค์ด true๋ก ๊ธฐ๋กํด๋๋๋ค.
// queue์ ๊ธธ์ด๊ฐ 0์ด๋ฉด ์ข
๋ฃํ๋ while๋ฌธ์ ์ฌ์ฉํ๋ค. queue์ ๊ธธ์ด๊ฐ 0์ด๋ผ๋ ๊ฒ์ vertex๊ฐ edges๊ฐ ์์ด์ ๋ค๋ฅธ vertex
// ๋ฅผ push๋ฐ์ง ๋ชปํ๋ค๋ ๋ป์ด๋ฏ๋ก ์ํ๋ฅผ ์ข
๋ฃํ๋ค.
// queue์์ shift๋ฅผ ํ์ฌ ๋
ธ๋๋ฅผ ๊บผ๋ธ๋ค.
// ๊บผ๋ธ ๋
ธ๋๊ฐ to์ ๊ฐ๋ค๋ฉด true๋ฅผ ๋ฆฌํดํ๋ค. ๋ชฉ์ ์ง๋ to์ธ๋ฐ, from์์ to์ ๋์ฐฉํ๋ค๋ ๊ฒ์ ์ด๋ป๊ฒ๋ ๊ฐ์ ์ด ์ฐ๊ฒฐ๋์ด์๋ค๋ ๊ฒ
// ์ ์๋ฏธํ๊ธฐ ๋๋ฌธ์ด๋ค.
// ๊บผ๋ธ ๋
ธ๋์์ ์ํ๋์ง์๊ณ ๊ฐ์ ์ด ์๋ ๋
ธ๋๋ค์ queue์ ํธ์ฌํ๋ if๋ฌธ์ ์์ฑํ๋ค.
// ์ด๋์ ํจ์์์ ๋ฐ์ input์ adjacency matrix์ด๋ฏ๋ก ์ธ์ ํ๋ ฌ์ ํน์ฑ์ ๊ณ ๋ คํ์ฌ for๋ฌธ์ ์ฌ์ฉํด ์ด๋์ ๊ฐ์ ์ด ์ฐ๊ฒฐ๋์ด
// ์๋์ง ๊ณ ๋ คํ๋ค.
const result = connectedVertices([
[0, 1],
[2, 3],
[4, 5],
]);
console.log(result); // 3
// ์ฒซ๋ฒ์งธ
// edges์์ ์๋ ์ต๋ ๋ฒํ
์ค๋ฅผ ๊ตฌํ๋ค.
// ์ต๋ ๋ฒํ
์ค ์๋งํผ ์ํํ๋ค๊ณ ๋งํนํ ์ ์๋ ๋ฐฐ์ด์ ๋ง๋ ๋ค.
// ๊ฐ์ ์ด๋ ์ฐ๊ฒฐ๋ ๊ทธ๋ํ์ ์๋ฅผ ์ธ๊ธฐ์ํด ์นด์ดํธ ๋ณ์๋ฅผ ์ ์ธํ๋ค.
// Adjacency List๋ฅผ ๋ง๋ ๋ค.
// 0vertex๋ถํฐ ์ต๋ vertex๋งํผ ์ํํ๊ธฐ ์ํ์ฌ for๋ฌธ์ ์ ์ธํ๋ค.
// for๋ฌธ์์ ๋ง์ฝ ์ํ๋์ง ์์ ๋ฒํ
์ค๋ผ๋ฉด bfs๋ฅผ ํธ์ถํด์ count๋ฅผ ์ฆ๊ฐ์ํจ๋ค.
// ๋ชจ๋ ๋ฒํ
์ค๊ฐ ์ํ๋๋ฉด count๋ฅผ ๋ฆฌํดํ๋ค
// bfs๋ Breath First Search์ ์ฝ์๋ก ๊ตฌํ์ ํ๋กํ๋ฉด ๋๋ค.
/*
ํ๋ฅผ ์์ฑ
ํ์ฌ ํด๋น๋ ธ๋๋ฅผ ํ์ ๋ฃ๊ณ ๊ทธ ํด๋น๋ ธ๋๋ฅผ ํ์ ๋ค์ด๊ฐ๋ค๊ณ ๋งํฌ๋ฅผ ํ๋ค
๋ฐ์์ ํ๋ ๊บผ๋ด๊ณ ๊บผ๋ธ ๋
ธ๋์ ์์ ๋
ธ๋๋ค์ ํ์ ๋ฃ๊ณ ๊นจ๋ธ ๋
ธ๋๋ ์ถ๋ ฅํด์ค๋ค. ์ด๋ ํ์ ๋ค์ด๊ฐ
๋
ธ๋๋ ๋งํฌ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
๋ค์ ํ์ ๋ค์ด๊ฐ ๋ ธ๋๋ฅผ ๊บผ๋ด๊ณ ๊บผ๋ธ ๋ ธ๋์ ์์ ๋ ธ๋๋ค์ ํ์ ์ง์ด ๋ฃ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊บผ๋ธ ๋ ธ๋๋ ์ถ๋ ฅํด์ฃผ๊ณ , ์ด๋ ํ์๋ค์ด๊ฐ ๋ ธ๋๋ ๋งํฌ์ฒ๋ฆฌํด์ค๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์ ํ์ ๋ค์ด๊ฐ ๋ ธ๋๋ฅผ ๊บผ๋ธ๋ค. ๊บผ๋ธ ๋ ธ๋์ ์์๋ ธ๋๋ฅผ ํ์ ๋ฃ์ด์ฃผ๊ณ ๋งํฌ์ฒ๋ฆฌํด์ค๋ค. ์ด๋ ๊บผ๋ธ ๋ ธ๋๋ ์ถ๋ ฅํด์ค๋ค.
*/
/*
๋๋ฒ์งธ
1. edges์์ ์๋ ์ต๋ vertex๋ฅผ ๊ตฌํ๋ค.
2. adjacency list ๋ฅผ ๋ง๋ค์ด์ vertex ์ ๋งํผ key, property๋ฅผ ๋ง๋ ๋ค.
2-1. ๋ง๋ adjacency list์ edges๋ ๋ฌดํฅ๊ทธ๋ํ๋ฅผ ๋ด์๋ ๊ฒ์ด๋ฏ๋ก ๊ทธ์ ๋ฐ๋ผ adjacency list๋ฅผ ๋ง๋ ๋ค.
3. ์กฐํ๋ vertex๋ฅผ ํ์ธํ ์ ์๋ ๋ฐฐ์ด๊ณผ ์ฐ๊ฒฐ๋ ์ ์ ์ ์ปดํฌ๋ํธ ์๋ฅผ ์นด์ดํธํ ์ ์๋ ์นด์ดํฐ ๋ณ์๋ฅผ ์ ์ธํ๋ค.
4. 0๋ถํฐ ์ต๋ ๋ฒํ
์ค ์๋งํผ ์ํํ์ฌ ๊ฐ์ ์ ๋ฐ๋ผ ์ ์ ์ ์ํํ ์ ์๋๋ก for๋ฌธ์ ๋ง๋ ๋ค.
5. for๋ฌธ์์์ ๋ง์ฝ ์ํ๋์ง ์์ vertex๊ฐ ์๋ค๋ฉด bfsํจ์๋ฅผ ํธ์ถํ๊ณ , ์นด์ดํฐ๋ณ์๋ฅผ 1์ฉ ๋ํ๋ค.
6. ์ด๋ bfsํจ์๋ ์ํ๋, ์กฐํ๋ ๋ฒํ
์ค๋ฅผ ํ์ธํ๊ธฐ์ํ ๋ฐฐ์ด์ ์ธ์๋ก ๋ฐ์์, ์กฐํ๋์๋ค๋ฉด ํด๋น ์ธ๋ฑ์ค๋ฅผ true๋ก ํ ๋นํ์ฌ
7. ์ค๋ณต๋์ด ์กฐํ๋์ง ์๋๋กํ๋ค.
8. ๋ง์ง๋ง์ผ๋ก ์ฐ๊ฒฐ๋ ์ ์ ์ ์ปดํฌ๋ํธ์ ์๋ฅผ ์ซ์๋ก ๋ฐํํ์ฌ ๋ฆฌํดํ๋ค.
*/