๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm/์ธํ”„๋Ÿฐ(inflearn)

[ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(JavaScript) ] section09 - 1 - ๊ทธ๋ž˜ํ”„์™€ ์ธ์ ‘ํ–‰๋ ฌ

by YWTechIT 2021. 10. 6.
728x90

๐Ÿ“ section09 - 1 - ๊ทธ๋ž˜ํ”„์™€ ์ธ์ ‘ํ–‰๋ ฌ

์ด๋ฒˆ ์„น์…˜์€ ๊ทธ๋ž˜ํ”„์™€ ํƒ์ƒ‰(DFS, BFS)์— ๋Œ€ํ•ด์„œ ๋ฐฐ์šด๋‹ค. ์ง€๊ธˆ์€ ๋ฌธ์ œ๋ฅผ ํ’€์ง€ ์•Š๊ณ  ๊ทธ๋ž˜ํ”„์— ๋Œ€ํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์•Œ์•„๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณด์ž. ๊ทธ๋ž˜ํ”„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ด๋ฃจ์–ด์ง„๋‹ค.

 

  1. Vertex: ์ •์ , ๋…ธ๋“œ
  2. Edge: ๋…ธ๋“œ์™€ ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฐ„์„ 
  3. graph: 2์ฐจ์› ๋ฐฐ์—ด์—์„œ๋Š” index๊ฐ€ ์ •์ (vertex) ๋ฒˆํ˜ธ๋‹ค.

 

๊ทธ๋ž˜ํ”„์˜ ์ข…๋ฅ˜๋Š” 3๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. ์ž…๋ ฅ์ด ์ฃผ์–ด์งˆ ๋•Œ graph๋ณ„๋กœ ์–ด๋–ป๊ฒŒ ์ž…๋ ฅํ•˜๋Š”์ง€ ์ฝ”๋“œ๋กœ ๋‚˜ํƒ€๋ƒˆ๋‹ค. (์—ฌ๊ธฐ์„œ๋Š” ์ธ์ ‘ ํ–‰๋ ฌ๋กœ ํ‘œํ˜„ํ•จ)

 

1. ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„(unDirected Graph): ๋ฐฉํ–ฅ์ด ์—†๋Š” ๊ทธ๋ž˜ํ”„ ์ฆ‰, ์–‘๋ฐฉํ–ฅ์ธ ๊ทธ๋ž˜ํ”„๋‹ค. ์ž…๋ ฅ์€ ๋ณดํ†ต [a, b] ํ˜•ํƒœ๋กœ ์ฃผ์–ด์ง€๋Š”๋ฐ ์—ฌ๊ธฐ์„œ graph[a][b]=1, graph[b][a]=1์„ ๋ชจ๋‘ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

 

// ์ธ์ ‘ํ–‰๋ ฌ
let node = 5;
let edge = 5;

console.log(unDirectedGraph(node, edge));

function unDirectedGraph(node, edge){
  let graph = Array.from(Array(node+1), () => Array(edge+1).fill(0));
  let input = [[1, 2], [1, 3], [2, 4], [3, 4], [2, 5]];

  for (let [a, b] of input){
    graph[a][b] = 1;
    graph[b][a] = 1;
  }

  return graph;
}

๐Ÿ‘‰๐Ÿฝ [
  [ 0, 0, 0, 0, 0, 0 ],
  [ 0, 0, 1, 1, 0, 0 ],
  [ 0, 1, 0, 0, 1, 1 ],
  [ 0, 1, 0, 0, 1, 0 ],
  [ 0, 0, 1, 1, 0, 0 ],
  [ 0, 0, 1, 0, 0, 0 ]
]

 

2. ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„(directed Graph): ๋ฐฉํ–ฅ์ด ์ •ํ•ด์ ธ ์žˆ๋Š” ๊ทธ๋ž˜ํ”„๋‹ค. ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์™€๋Š” ๋‹ฌ๋ฆฌ ์ •์ ์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฐฉํ–ฅ๋งŒ graph์— ์ž…๋ ฅํ•œ๋‹ค.

 

 

// ์ธ์ ‘ํ–‰๋ ฌ
console.log(directedGraph(node, edge));

function directedGraph(node, edge){
  let graph = Array.from(Array(node+1), () => Array(edge+1).fill(0));
  let input = [[1, 2], [1, 3], [2, 4], [3, 4], [2, 5]];

  for (let [a, b] of input){
    graph[a][b] = 1;
  }

  return graph;
}

๐Ÿ‘‰๐Ÿฝ [
  [ 0, 0, 0, 0, 0, 0 ],
  [ 0, 0, 1, 1, 0, 0 ],
  [ 0, 0, 0, 0, 1, 1 ],
  [ 0, 0, 0, 0, 1, 0 ],
  [ 0, 0, 0, 0, 0, 0 ],
  [ 0, 0, 0, 0, 0, 0 ]
]

 

3. ๊ฐ€์ค‘์น˜ ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„(weighted directed Graph): ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์ด๋ฉด์„œ ๊ฐ€์ค‘์น˜๋„ ๊ฐ™์ด ๋‚˜ํƒ€๋‚ธ ๊ทธ๋ž˜ํ”„์ด๋‹ค. ํ•œ ๋„์‹œ์—์„œ ๋‹ค๋ฅธ ๋„์‹œ๋กœ ์ด๋™ํ•  ๋•Œ ๋“œ๋Š” ๋น„์šฉ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ์—์„œ ๋“ฑ์žฅํ•œ๋‹ค. ์ž…๋ ฅ์„ a, b, c๋กœ ๋ฐ›์•„ graph[a][b]=c ์ฒ˜๋Ÿผ ๋น„์šฉ๊นŒ์ง€ ๊ฐ™์ด graph์— ์ž…๋ ฅํ•ด์•ผํ•œ๋‹ค.

 

 

// ์ธ์ ‘ํ–‰๋ ฌ
console.log(weightedDirectedGraph(node, edge));

function weightedDirectedGraph(node, edge){
  let graph = Array.from(Array(node+1), () => Array(edge+1).fill(0));
  let input = [[1, 2, 2], [2, 5, 5], [3, 4, 5], [1, 3, 4], [4, 2, 2]];

  for (let [a, b, c] of input){
    graph[a][b] = c;
  }

  return graph;
}

๐Ÿ‘‰๐Ÿฝ [
  [ 0, 0, 0, 0, 0, 0 ],
  [ 0, 0, 2, 4, 0, 0 ],
  [ 0, 0, 0, 0, 0, 5 ],
  [ 0, 0, 0, 0, 5, 0 ],
  [ 0, 0, 2, 0, 0, 0 ],
  [ 0, 0, 0, 0, 0, 0 ]
]

 

728x90

 

์œ„์—์„œ๋Š” ์ธ์ ‘ ํ–‰๋ ฌ๋กœ ๋‚˜ํƒ€๋ƒˆ๋Š”๋ฐ, ๊ทธ๋ž˜ํ”„์˜ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ผ ๋•Œ๋Š” ์ธ์ ‘ ํ–‰๋ ฌ๊ณผ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ์˜ ๋ฐฉ์‹์ด ์žˆ๋‹ค. ๊ฐ๊ฐ์˜ ํŠน์ง•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

 

1. ์ธ์ ‘ํ–‰๋ ฌ(adjacency-matrix): ๋…ธ๋“œ์™€ ๊ฐ„์„ ์˜ ์ •๋ณด๋ฅผ ํ–‰๋ ฌ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•, ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜์™€ ์ƒ๊ด€์—†์ด ๋ชจ๋“  ์ •์ ์„ ํ‘œํ˜„ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ •์ ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์„์ˆ˜๋ก ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋Š˜์–ด๋‚œ๋‹ค. ๊ฐ€์ค‘์น˜๋ฅผ ๋ฐฉํ–ฅ๊ทธ๋ž˜ํ”„๋Š” ์ธ์ ‘ ํ–‰๋ ฌ๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋ฌด๋ฐฉํ–ฅ, ๋ฐฉํ–ฅ์„ฑ๊ทธ๋ž˜ํ”„ ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ ์ •์ ์˜ ๊ฐฏ์ˆ˜๊ฐ€ 10,000 ์ดํ•˜๋ผ๋ฉด ์ธ์ ‘ํ–‰๋ ฌ๋กœ ํ’€์ž.

 

// graph์— ๊ฐ’์„ ์ž…๋ ฅํ•˜๋Š” ๋ฐฉ๋ฒ•
let n = 5;
let m = 9;
let arr = [[1, 2], [1, 3], [1, 4], [2, 1], [2, 3], [2, 5], [3, 4], [4, 2], [4, 5]];
let graph = Array.from(Array(n+1), () => Array(n+1).fill(0));

// ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„
for (let [a, b] of arr){
    graph[a][b]=1;
    graph[b][a]=1;
}

// ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„
for (let [a, b] of arr){
    graph[a][b]=1;
}

// ๊ฐ€์ค‘์น˜ ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„
let graph = [[1, 2, 2], [2, 5, 5], [3, 4, 5], [1, 3, 4], [4, 2, 2]];

for (let [a, b, c] of arr){
    graph[a][b]=c;
}

 

2. ์ธ์ ‘๋ฆฌ์ŠคํŠธ(adjacency-list): ๋…ธ๋“œ์™€ ๊ฐ„์„ ์˜ ์ •๋ณด๋ฅผ ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•, ์—ฐ๊ฒฐ๋œ ๊ฐ„์„ ๋งŒ ํ‘œ์‹œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ธ์ ‘ ํ–‰๋ ฌ๋ณด๋‹ค ๋น„๊ต์  ๊ฐ„๋‹จํ•˜๋‹ค. ์ •์ ์˜ ์ˆœ์„œ๋Š” ๊ผญ ์˜ค๋ฆ„์ฐจ์ˆœ์ด ์•„๋‹ˆ์–ด๋„ ์ƒ๊ด€์—†๋‹ค. ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ๋Š” ์ •์ ์˜ ๊ฐœ์ˆ˜๋งŒํผ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฆฌ๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐ„์„ ์˜ ๊ฐฏ์ˆ˜ graph[v].length ๋งŒํผ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ ค์•ผ ์‹คํ–‰ ์†๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค. ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ์— ์žˆ๋Š” ์ •์ ์€ ํ•„์ˆ˜๋กœ ํ•œ ๋ฒˆ์”ฉ ๋“ค๋ ค์•ผ ํ•˜๋Š” ์ •์ ์ด๋ฏ€๋กœ (์™œ๋ƒํ•˜๋ฉด ์ด๋ฏธ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋Š” ์ •์ ๋งŒ ํ‘œ์‹œํ•˜๊ธฐ ๋•Œ๋ฌธ) ์กฐ๊ฑด๋ฌธ์— graph[v][i]๋กœ ๊ฐ’์„ ํ™•์ธํ•˜๋Š” ๋Œ€์‹  visited ์—ฌ๋ถ€๋งŒ ํ™•์ธํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ์ •์ ์˜ ๊ฐœ์ˆ˜๊ฐ€ 10,000 ์ด์ƒ์ผ ๋•Œ๋Š” ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ž.

 

// graph์— ๊ฐ’์„ ์ž…๋ ฅํ•˜๋Š” ๋ฐฉ๋ฒ•
let n = 5;
let m = 9;
let arr = [[1, 2], [1, 3], [1, 4], [2, 1], [2, 3], [2, 5], [3, 4], [4, 2], [4, 5]];
let graph = Array.from(Array(n+1), () => Array());

// ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„
for (let [a, b] of arr){
    graph[a].push(b);
}

console.log(graph)
๐Ÿ‘‰๐Ÿฝ [ [], [ 2, 3, 4 ], [ 1, 3, 5 ], [ 4 ], [ 2, 5 ], [] ]
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€