📝 코테/BOJ

[Swift] 백준1260 DFS와 BFS

JerryiOS 2023. 3. 30. 15:05

import Foundation

let NMV = readLine()!.components(separatedBy: " ").map { Int($0)! }
let N = NMV[0]
let M = NMV[1]
let V = NMV[2]

var graph = [String: [String]]()

initializeGraph()

for _ in 1...M {
    let AB = readLine()!.components(separatedBy: " ")
    let A = AB[0]
    let B = AB[1]
    
    graph[A]?.append(B)
    graph[B]?.append(A)
}

printArray(DFS(start: String(V)))
printArray(BFS(start: String(V)))

func DFS(start: String) -> [String] {
    var visitedQueue: [String] = []
    var needVisitStack: [String] = [start]
    
    while !needVisitStack.isEmpty {
        let node: String = needVisitStack.removeLast()
        if visitedQueue.contains(node) { continue }
        
        visitedQueue.append(node)
        // 스택은 removeLast()로 노드를 가져오기 때문에 정렬을 내림차순으로 해줘야 작은 수부터 뽑힘
        needVisitStack += graph[node]?.sorted(by: { Int($0)! > Int($1)! }) ?? []
    }
    
    return visitedQueue
}

func BFS(start: String) -> [String] {
    var visitedQueue: [String] = []
    var needVisitQueue: [String] = [start]
    
    while !needVisitQueue.isEmpty {
        let node: String = needVisitQueue.removeFirst()
        if visitedQueue.contains(node) { continue }
        
        visitedQueue.append(node)
        needVisitQueue += graph[node]?.sorted(by: { Int($0)! < Int($1)! }) ?? []
    }
    
    return visitedQueue
}

func initializeGraph() {
    for i in 1...N {
        graph[String(i)] = []    // 그래프 초기화
    }
}

func printArray(_ arr: [String]) {
    for str in arr {
        if str.hashValue == arr.last?.hashValue {
            print(str)
        } else {
            print(str, terminator: " ")
        }
    }
}

 

반응형