백준 - DFS와 BFS (1260)

Seoyoung Lee·2023년 1월 26일
0

알고리즘

목록 보기
23/104
post-thumbnail
struct Queue<T> {
    var input: [T] = []
    var output: [T] = []
    
    var isEmpty: Bool {
        return input.isEmpty && output.isEmpty
    }
    
    var count: Int {
        return input.count + output.count
    }
    
    mutating func enqueue(_ element: T) {
        input.append(element)
    }
    
    mutating func delete() -> T {
        if output.isEmpty {
            output = input.reversed()
            input.removeAll()
        }
        return output.removeLast()
    }
}

let input = readLine()!.split(separator: " ").map{ Int(String($0))! }
let (N, M, V) = (input[0], input[1], input[2])
var graph: [[Int]] = Array(repeating: [], count: N+1)
var visited = Array(repeating: false, count: N+1)
var queue = Queue<Int>()

var dfsResult = ""
var bfsResult = ""

// 인접 리스트 만들기
for _ in 0..<M {
    let input = readLine()!.split(separator: " ").map{ Int(String($0))! }
    graph[input[0]].append(input[1])
    graph[input[1]].append(input[0])
}
// 인접 리스트 정렬
for i in 1...N {
    graph[i].sort()
}

dfs(V)
visited = Array(repeating: false, count: N+1)
bfs(V)

print(dfsResult)
print(bfsResult)

func dfs(_ number: Int) {
    visited[number] = true
    dfsResult += "\(number) "
    for node in graph[number] {
        if !visited[node] {
            dfs(node)
        }
    }
}

func bfs(_ number: Int) {
    visited[number] = true
    queue.enqueue(number)
    while !queue.isEmpty {
        let current = queue.delete()
        bfsResult += "\(current) "        
        for node in graph[current] {
            if !visited[node] {
                visited[node] = true
                queue.enqueue(node)
            }
        }
    }
}
  • DFS를 먼저 실행한 후 BFS를 실행하기 전 visited 배열을 초기화해준다.
  • BFS에서 큐에 들어온 순서대로 값을 꺼내기 때문에 for문 바깥에서 bfsResult에 값을 추가해도 무방하다.
profile
나의 내일은 파래 🐳

0개의 댓글