문제

가중치 없는 방향 그래프 G가 주어졌을 때, 모든 정점 (i, j)에 대해서, i에서 j로 가는 길이가 양수인 경로가 있는지 없는지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 정점의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄부터 N개 줄에는 그래프의 인접 행렬이 주어진다. i번째 줄의 j번째 숫자가 1인 경우에는 i에서 j로 가는 간선이 존재한다는 뜻이고, 0인 경우는 없다는 뜻이다. i번째 줄의 i번째 숫자는 항상 0이다.

출력

총 N개의 줄에 걸쳐서 문제의 정답을 인접행렬 형식으로 출력한다. 정점 i에서 j로 가는 길이가 양수인 경로가 있으면 i번째 줄의 j번째 숫자를 1로, 없으면 0으로 출력해야 한다.

내가 푼 풀이

- 주어진 그래프를 연결리스트로 저장한다.

- DFS를 이용하여 시작점부터 이동할 수 있는 모든 정점을 탐색하고 저장한다.

- 0번째부터 n-1번째까지 반복하며 탐색한다.

- 이미 방문한 지점이라면 break를 통해 반복문을 탈출했었지만, 만약 이중으로 연결된 리스트라면 break 반복탈출은 원하는 답이 안 나온다.

- 주어진 정점의 개수가 작아서 모든 간선을 탐색하는 방법을 사용했다.

 

import Foundation

// 입력
let n = Int(readLine()!)!
var graph = [Int: [Int]]()

// 그래프 입력
for i in 0..<n {
    let input = readLine()!.split(separator: " ").map{ Int($0)! }
    for j in 0..<input.count {
        if input[j] == 1 {
            if graph[i] == nil {
                graph[i] = [j]
            } else {
                graph[i]!.append(j)
            }
        }
    }
}

// DFS
for i in 0..<n {
    var arr = Array(repeating: 0, count: n)
    var needVisitQueue = [Int]()
    if graph[i] != nil {
        needVisitQueue = graph[i]!
        while !needVisitQueue.isEmpty {
            var node = needVisitQueue.removeLast()
            if arr[node] == 1 { continue }
            
            arr[node] = 1
            if graph[node] != nil {
                needVisitQueue += graph[node]!
            }
        }
    }
    print(arr.map{ String($0) }.joined(separator: " "))
}

 

'코딩테스트 > 백준' 카테고리의 다른 글

BOJ-2012 등수 매기기 Swift  (0) 2023.07.10
BOJ-9252 LCS 2 Swift  (0) 2023.07.10
BOJ-1417 국회의원 선거 Swift  (0) 2023.07.01
BOJ-10942 팰린드롬? Swift  (0) 2023.07.01
BOJ-2206 벽 부수고 이동하기 Swift  (0) 2023.06.30

+ Recent posts