๊ด€๋ฆฌ ๋ฉ”๋‰ด

Daehyunii's Dev-blog

20 ๊ทธ๋ž˜ํ”„ ๋ณธ๋ฌธ

๐Ÿ“š Language & CS knowledge/Algorithm & Data structure

20 ๊ทธ๋ž˜ํ”„

Daehyunii 2022. 8. 17. 20:56

20.1 ๊ทธ๋ž˜ํ”„ 

  ๊ทธ๋ž˜ํ”„๋ž€ ์œ ํ•œํ•˜๊ณ  ๋ณ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ผญ์ง€์ (๋…ธ๋“œ)์˜ ์ง‘ํ•ฉ์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ด๋‹ค. ์ด ๊ผญ์ง€์ ๋“ค์˜ ์ง‘ํ•ฉ์— ์ˆœ์„œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„, ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์œ ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„๋ผ๊ณ  ํ•œ๋‹ค. ์ฆ‰, ๊ทธ๋ž˜ํ”„๋Š” ๋…ธ๋“œ์™€ ๋…ธ๋“œ๋“ค์˜ ์—ฐ๊ฒฐ์„ ๋ชจ์€ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ํŠธ๋ฆฌ๋„ ๊ทธ๋ž˜ํ”„์˜ ์ผ์ข…์ด๋‹ค. ๋‹ค๋งŒ ํŠธ๋ฆฌ๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ทœ์น™์ด ์ถ”๊ฐ€๋˜์–ด ๋ถ€๋ชจ์™€ ์ž์‹๋…ธ๋“œ๋กœ ๊ตฌ์„ฑ๋˜๊ณ  ์‹œ์ž‘์ ์ธ ๋ฃจํŠธ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋ž˜ํ”„์—๋Š” ๋ถ€๋ชจ ๋…ธ๋“œ๋ผ๋Š” ๊ฒƒ์ด ์—†๊ณ , ์‹œ์ž‘์ ๋„ ์—†๋‹ค. ๋‹ค ๋™์ผํ•œ ๋…ธ๋“œ์ผ ๋ฟ์ด๋‹ค. ๋˜ํ•œ ๊ทธ๋ž˜ํ”„๋Š” ํŠธ๋ฆฌ๋‚˜ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๊ฐ™์€ ์ˆ˜์ค€์˜ ํŒจํ„ด์ด ์—†๋‹ค. ์ž์œ ๋กœ์šด ํ˜•์‹์˜ ๋…ธ๋“œ๊ฐ€ ์žˆ๊ณ  ๊ทธ ์‚ฌ์ด์— ์—ฐ๊ฒฐ๋งŒ ์žˆ์„ ๋ฟ์ด๋‹ค. ๋˜ํ•œ ํŠธ๋ฆฌ๋Š” ํ•œ ๋…ธ๋“œ์—์„œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๊ฒฝ๋กœ๊ฐ€ ๋”ฑ ํ•œ ๊ฐ€์ง€๋งŒ ์กด์žฌํ•ด์•ผ ํ•˜์ง€๋งŒ ๊ทธ๋ž˜ํ”„๋Š” ์ˆ˜ ๊ฐœ์˜ ๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

โ€ป์šฉ์–ด ์ •๋ฆฌ

1) ์ •์ (Vertex) : ๋…ธ๋“œ๋ฅผ ์˜๋ฏธํ•จ

2) ๊ฐ„์„ (Edge) : ๋…ธ๋“œ์™€ ๋…ธ๋“œ ์‚ฌ์ด์˜ ์—ฐ๊ฒฐ์„ ์˜๋ฏธํ•จ

3) ๊ฐ€์ค‘(Weighted) : ๊ฐ„์„ ์— ๊ฐ’์„ ๋ถ€์—ฌํ•œ ๊ฒƒ(์—ฐ๊ฒฐ ๊ทธ ์ž์ฒด์— ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.)

4) ๋น„๊ฐ€์ค‘(Unweighted) : ๊ฐ„์„ ์— ๊ฐ’์„ ๋ถ€์—ฌํ•˜์ง€ ์•Š์€ ๊ฒƒ

5) ๋ฐฉํ–ฅ(Directed) : ๊ฐ„์„ ์ด ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๊ฒƒ

6) ๋ฌด๋ฐฉํ–ฅ(Undirected) : ๊ฐ„์„ ์— ์กด์žฌํ•˜๋Š” ๋ฐฉํ–ฅ์„ฑ์ด ์—†์Œ

 

20.2 ๊ทธ๋ž˜ํ”„ ์ •๋ ฌ : ์ธ์ ‘ ํ–‰๋ ฌ vs ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ

  ๊ทธ๋ž˜ํ”„์— ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ธ์ ‘ ํ–‰๋ ฌ(Adjacency Matrix)์™€ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ(Adjacency Lists)๊ฐ€ ์žˆ๋‹ค.

 

1) ์ธ์ ‘ ํ–‰๋ ฌ(Adjacency Matrix)

  ํ–‰๋ ฌ์ด๋ž€ ์ด์ฐจ์› ๊ตฌ์กฐ๋กœ ํ•ญ์ƒ์€ ์•„๋‹ˆ์ง€๋งŒ ๋ณดํ†ต ์ค‘์ฒฉ ํ–‰๋ ฌ๋กœ ํ‘œํ˜„ํ•œ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ํ–‰๊ณผ ์—ด์— ๋งž์ถฐ์„œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

์žฅ์  : ํŠน์ • ๊ฐ„์„ ์„ ํ™•์ธํ•˜๋Š” ๊ฒฝ์šฐ์— ๋น ๋ฅด๋‹ค.

๋‹จ์  : ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ์— ๋น„ํ•ด ๊ณต๊ฐ„์„ ๋” ๋งŽ์ด ์ฐจ์ง€ํ•˜๊ณ , ๋ชจ๋“  ๊ฐ„์„ ์„ ์ˆœํ™˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋А๋ฆฌ๋‹ค.(๋ฐ์ดํ„ฐ๊ฐ€ ๋„“๊ฒŒ ํผ์ ธ์žˆ๋Š” ๊ฒฝ์šฐ ์ข‹์ง€ ์•Š๋‹ค.)

 

2) ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ(Adjacency Lists)

  ์ •์ ์ด ์ˆซ์ž๋กœ ์ด๋ค„์ง„ ๊ฒฝ์šฐ์—๋Š” ๋ฐฐ์—ด์„ ํ†ตํ•ด์„œ ๊ฐ„์„ ๋“ค์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๊ณ , ํŠน์ • ๋ฌธ์ž์—ด์ด๋‚˜ ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ํ•ด์‹œํ…Œ์ด๋ธ” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด ๊ฐ„์„ ๋“ค์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.(ํ‚ค์™€ ๊ฐ’์„ ์Œ์œผ๋กœ ์ €์žฅํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ)

์žฅ์  : ์ธ์ ‘ ํ–‰๋ ฌ์— ๋น„ํ•ด ๊ณต๊ฐ„์„ ์ ๊ฒŒ ์ฐจ์ง€ํ•˜๊ณ  ๋ชจ๋“  ๊ฐ„์„ ์„ ์ˆœํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ ๋น ๋ฅด๋‹ค.

๋‹จ์  : ํŠน์ • ๊ฐ„์„ ์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ๋А๋ฆฌ๋‹ค.

//๋…ธ๋“œ๊ฐ€ ์ˆซ์ž๋กœ ์ด๋ค„์ง„ ๊ฒฝ์šฐ ์ธ๋ฑ์Šค๋ฅผ ์ •์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๊ณ  ํ•ด๋‹น ์ •์ ์˜ ๊ฐ„์„ ๋“ค์„ ๋ฐฐ์—ด๋กœ ํ‘œ์‹œ
[[1,5],[0,2],[1,3],[2,4],[3,5],[4,0]]

//๋…ธ๋“œ๊ฐ€ ์ˆซ์ž๋กœ ์ด๋ค„์ง€์ง€ ์•Š์€ ๊ฒฝ์šฐ
{
    A: ["B", "F"],
    B: ["A", "C"],
    C: ["B", "D"],
    D: ["C", "E"],
    E: ["D", "F"],
    F: ["E", "A"]
}

20.3 ์ •์  ์ถ”๊ฐ€

  ์ธ์ˆ˜๋ฅผ ๋ฐ›์•„์„œ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ์— ํ”„๋กœํผํ‹ฐ๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค. ์ •์ ์˜ ์ด๋ฆ„์„ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ์˜ ํ‚ค๋กœ ๋งŒ๋“ค๊ณ  ๊ฐ’์— ๊ฐ„์„ ๋“ค์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.(๊ฐ’์˜ ์ดˆ๊ธฐ ์„ค์ •์€ ๋นˆ ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋œ๋‹ค.)

// ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ™œ์šฉ
class Graph{
    constructor(){
        this.adjacencyList = {};
    }
    addVertex(vertex){
        if(!this.adjacencyList[vertex]) this.adjacencyList[vertex] = []; 
    }
}

20.4 ๊ฐ„์„  ์ถ”๊ฐ€

  ๊ฐ„์„ ์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋Š” ๋‘ ๊ฐœ์˜ ์ •์ ์— ๋ชจ๋‘ ๋ช…์‹œํ•˜์—ฌ์•ผ ํ•œ๋‹ค.(๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์˜ ๊ฒฝ์šฐ)

class Graph{
    constructor(){
        this.adjacencyList = {};
    }
    addVertex(vertex){
        if(!this.adjacencyList[vertex]) this.adjacencyList[vertex] = [];
    }
    
    addEdge(v1,v2){
        this.adjacencyList[v1].push(v2);
        this.adjacencyList[v2].push(v1);
	}
}

20.5 ๊ฐ„์„  ์ œ๊ฑฐ

  ์ •์ ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ •์  ๋‘ ๊ฐœ๋ฅผ ์ธ์ˆ˜๋กœ ๋ฐ›์•„์•ผ ํ•˜๊ณ , ํ•˜๋‚˜์˜ ์ •์ ์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฐฐ์—ด์— ๋‹ค๋ฅธ ํ•˜๋‚˜์˜ ์ •์ ์„ ์ œ๊ฑฐํ•œ ๋ฐฐ์—ด์„ ์žฌํ• ๋‹น ํ•ด์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋จธ์ง€ ์ •์ ์—๋„ ๋™์ผํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์žฌํ• ๋‹น ํ•ด์ค€๋‹ค.

class Graph{
    constructor(){
        this.adjacencyList = {};
    }
    addVertex(vertex){
        if(!this.adjacencyList[vertex]) this.adjacencyList[vertex] = [];
    }
    addEdge(v1,v2){
        this.adjacencyList[v1].push(v2);
        this.adjacencyList[v2].push(v1);
    }
   
    removeEdge(vertex1,vertex2){
        this.adjacencyList[vertex1] = this.adjacencyList[vertex1].filter(
            v => v !== vertex2
        );
        this.adjacencyList[vertex2] = this.adjacencyList[vertex2].filter(
            v => v !== vertex1
        );
    }
}

//filter() ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ์กฐ๊ฑด์— ๋งž๋Š” ์š”์†Œ๋“ค๋งŒ ์ทจํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ํ•ด์คŒ

20.6 ์ •์  ์ œ๊ฑฐ

  ์ •์ ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹จ์ˆœํžˆ ์ •์ ๋งŒ์„ ์ œ๊ฑฐํ•ด์„œ๋Š” ์•ˆ๋˜๊ณ  ํ•ด๋‹น ์ •์ ๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋‹ค๋ฅธ ์ •์ ๋“ค์˜ ๋ฐฐ์—ด ๋‚ด์—์„œ๋„ ์ง€์›Œ์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋ฃจํ”„๋ฅผ ๋Œ๋ฉฐ ๋จผ์ € ๊ฐ„์„  ์ œ๊ฑฐ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์‚ญ์ œํ•˜๋ ค๋Š” ์ •์ ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐ„์„ ๋“ค์„ ๋จผ์ € ๋‹ค ์ œ๊ฑฐํ•ด์ฃผ๊ณ  ์ •์ ์„ ๋งˆ์ง€๋ง‰์— ์ œ๊ฑฐํ•ด์•ผ ํ•œ๋‹ค.

class Graph{
    constructor(){
        this.adjacencyList = {};
    }
    addVertex(vertex){
        if(!this.adjacencyList[vertex]) this.adjacencyList[vertex] = [];
    }
    addEdge(v1,v2){
        this.adjacencyList[v1].push(v2);
        this.adjacencyList[v2].push(v1);
    }
   
    removeEdge(vertex1,vertex2){
        this.adjacencyList[vertex1] = this.adjacencyList[vertex1].filter(
            v => v !== vertex2
        );
        this.adjacencyList[vertex2] = this.adjacencyList[vertex2].filter(
            v => v !== vertex1
        ); // ํ•„ํ„ฐ๋ฉ”์„œ๋“œ๋Š” ์›๋ณธ ๋ฐฐ์—ด ๋ณ€๊ฒฝ ์•ˆ๋จ ๋ณต์‚ฌํ•ด์„œ ์ƒˆ๋กญ๊ฒŒ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด๋ƒ„
    }

    removeVertex(vertex){
        while(this.adjacencyList[vertex].length){
            const adjacentVertex = this.adjacencyList[vertex].pop(); 
            console.log(adjacentVertex);
            console.log(this.adjacencyList[vertex]);
            //์›๋ณธ ๋ฐฐ์—ด ๋ณ€๊ฒฝ๋จ, pop๋ฉ”์„œ๋“œ๋Š” ๋ฐฐ์—ด์˜ ๋งจ ๋’ค ์š”์†Œ๋ฅผ ์ง€์šฐ๊ณ  ์ง€์šด ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•จ
            this.removeEdge(vertex, adjacentVertex);
        }
        delete this.adjacencyList[vertex]
    }
}