관리 메뉴

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]
    }
}

 

'πŸ“š Language & CS knowledge > Algorithm & Data structure' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

23 동적 ν”„λ‘œκ·Έλž˜λ°  (0) 2022.08.21
21 κ·Έλž˜ν”„ 순회  (0) 2022.08.19
19 ν•΄μ‹œ ν…Œμ΄λΈ”  (0) 2022.08.16
18 이진 νž™  (0) 2022.08.16
17 트리 순회  (0) 2022.08.16