Algorithm

[Swift 백준] 18352 특정 거리의 도시 찾기

Kim Roks 2025. 2. 17. 10:11

https://www.acmicpc.net/problem/18352

 

풀이 아이디어

- 단방향 그래프를 이용한 bfs문제입니다.

- 출발점에서 목표치까지 거리를 쟀을 때 특정 거리인 도시를 모두 출력합니다

- 해당 문제는 수의 범위가 크므로 큐를 직접 작성하여 풀이합니다.

풀이 

import Foundation

// n 도시개수, m 도로개수, k 목표거리, x 출발번호
let nmkx = readLine()!.split(separator: " ").map { Int($0)! }
let (n, m, k, x) = (nmkx[0], nmkx[1], nmkx[2], nmkx[3])

var graph: [[Int]] = Array(repeating: [], count: n + 1)

for _ in 0..<m {
    let input = readLine()!.split(separator: " ").map { Int($0)! }
    let (a, b) = (input[0], input[1])
    graph[a].append(b) // 단방향이므로 b -> a는 추가하지 않음
}

// 거리 저장 배열 (-1로 초기화)
var distance = Array(repeating: -1, count: n + 1)

func bfs(start: Int) {
    var q = Q()
    q.enqueue(start)
    distance[start] = 0  // 시작 지점은 거리 0

    while !q.isEmpty {
        let current = q.dequeue()
        
        for next in graph[current] {
            if distance[next] == -1 {  // 방문하지 않은 노드라면
                distance[next] = distance[current] + 1
                q.enqueue(next)
            }
        }
    }
}

bfs(start: x)

var resultArr = [Int]()
for i in 1...n {
    if distance[i] == k {
        resultArr.append(i)
    }
}

// 결과 출력
if resultArr.isEmpty {
    print("-1")
} else {
    resultArr.forEach { print($0) }
}


struct Q {
    private var input = [Int]()
    private var output = [Int]()
    var isEmpty: Bool { input.isEmpty && output.isEmpty }

    mutating func enqueue(_ newElement: Int) {
        input.append(newElement)
    }
    
    mutating func dequeue() -> Int{
        if output.isEmpty {
            output = input.reversed()
            input = []
        }
        return output.removeLast()
    }
}