[TIL]21.07.30

๋ฐ•์ฃผํ™ยท2021๋…„ 7์›” 30์ผ
0

Today I Learned

๋ชฉ๋ก ๋ณด๊ธฐ
44/104

๐Ÿ‘จโ€๐Ÿ’ป ์˜ค๋Š˜ ๊ณต๋ถ€ํ•œ ๊ฒƒ

BFS(Breadth First Search) ๋„ˆ๋น„ ์šฐ์„  ๊ฒ€์ƒ‰

BFS์„ ๊ตฌํ˜„ํ•ด๋ณด์•˜๋‹ค. (๋„˜๋‚˜ ์–ด๋ ค์šด ๊ฒƒ..)

1.

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๋ฌธ์„ ์‚ฌ์šฉํ•ด ์–ด๋””์— ๊ฐ„์„ ์ด ์—ฐ๊ฒฐ๋˜์–ด
// ์žˆ๋Š”์ง€ ๊ณ ๋ คํ•œ๋‹ค.

2.

	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. ๋งˆ์ง€๋ง‰์œผ๋กœ ์—ฐ๊ฒฐ๋œ ์ •์ ์˜ ์ปดํฌ๋„ŒํŠธ์˜ ์ˆ˜๋ฅผ ์ˆซ์ž๋กœ ๋ฐ˜ํ™˜ํ•˜์—ฌ ๋ฆฌํ„ดํ•œ๋‹ค.
*/

profile
๊ณ ํ†ต์—†๋Š” ์„ฑ์žฅ์€ ์—†๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค....

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