개발/Swift

백준 1260 DFS 와 BFS 구현하기

덤벨로퍼 2022. 4. 8. 17:31

DFS 는 깊이 우선 탐색으로

1번노드가 시작점일시 1번의 자식들

그리고 그 자식들을 돌면서 깊게 먼저 탐색하는방식이다.

개인적으로 dfs 를 구현하기위해 재귀를 사용한다.

그리고 dfs 에는 필요한 요소들이있다

starting point : 몇번 노드를 탐색할지
array (graph) : 각 노드들의 자식 정보
visited array : 해당 노드를 이미 탐색했는지 정보
result : 계속 갱신될 결과값 

visited array 와 result 는 mutating 이 필요하다.

따라서 dfs 재귀 함수에는 inout 을 넣어줘야 한다.

func dfs(n:Int,arr : [[Int]],visited: inout [Int],dfsArr:inout [Int]){
    if(visited[n-1] == 1){
        return
    }
    visited[n-1] = 1
    dfsArr.append(n)
    for i in 0..<arr.count{
        if(arr[i].contains(n)){
            //1있는경우
            let nIndex = arr[i].firstIndex(of: n)
            if(nIndex==0){
                dfs(n: arr[i][1], arr: arr,visited: &visited,dfsArr: &dfsArr)
            }else{
                dfs(n: arr[i][0], arr: arr,visited: &visited,dfsArr: &dfsArr)
            }
        }
    }
}

var dfsVisited = Array(repeating: 0, count: count)
var dfsArr = [Int]()
dfs(n: start, arr: arr, visited: &dfsVisited, dfsArr: &dfsArr)

BFS는 너비우선탐색이므로 만약 1의 자식이 2, 3 이있다면

2의 자식을 탐색하기 전에 2, 3 을 모두탐색을 끝내야한다.

그러기 위해 QUEUE를 사용한다.

bfs에도 이런게필요하다.

starting point : 몇번 노드를 탐색할지
array (graph) : 각 노드들의 자식 정보
visited array : 해당 노드를 이미 탐색했는지 정보
queue : 작업의 순서를 저장 

2와 3을 큐에 담고 2의 자식과 3의 자식은 그다음 순서에 넣어 줌으로써

순서대로 탐색 할수있다.

func bfs(start:Int,arr : [[Int]]){
    var answer = [Int]()
    var visited = Array(repeating: 0, count: count)
    var queue = [start]
    
    while !queue.isEmpty {
        let number = queue.removeFirst()
        if(visited[number-1]==1){
            continue
            
        }
        //인접 노드들 큐에 추가
        for i in 0..<arr.count{
            if(arr[i].contains(number)){
                let numberIndex = arr[i].firstIndex(of: number)
                if(numberIndex == 0 ){
                    queue.append(arr[i][1])
                }else{
                    queue.append(arr[i][0])
                }
            }
        }
        //visited처리
        visited[number-1] = 1
        //배열에 추가
        answer.append(number)
    }
    print(answer)
}