문제
가중치 없는 방향 그래프 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 |