Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 50 additions & 0 deletions WEEK11/백준_11404_플로이드/oliver.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
let INF = 100_000 * 100 + 1
let n = Int(readLine()!)!
let m = Int(readLine()!)!

// 인접리스트
var graph: [[(node: Int, weight: Int)]] = Array(repeating: [], count: n+1)
for _ in 0..<m {
let line = readLine()!.split(separator: " ").compactMap { Int($0) }
let (a, b, c) = (line[0], line[1], line[2])

graph[a].append((node: b, weight: c))
}

// dist 초기화
var dist: [[Int]] = Array(repeating: Array(repeating: INF, count: n+1), count: n+1)
for i in 1...n {
dist[i][i] = 0
}

// graph 순회하면서 dist행렬 채우기
for i in 1...n {
for edge in graph[i] {
let destination = edge.node
let weight = edge.weight

dist[i][destination] = min(weight, dist[i][destination])
}
}
Comment on lines +5 to +28
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

graph 인접 리스트를 생성한 뒤 다시 dist 행렬로 옮기는 과정은 메모리와 시간 측면에서 비효율적입니다. 입력을 읽으면서 직접 dist 행렬의 값을 최소값으로 갱신하도록 수정하면 코드가 더 간결해집니다.

// dist 초기화
var dist: [[Int]] = Array(repeating: Array(repeating: INF, count: n+1), count: n+1)
for i in 1...n {
    dist[i][i] = 0
}

// 입력 처리 및 dist 행렬 채우기
for _ in 0..<m {
    let line = readLine()!.split(separator: " ").compactMap { Int($0) }
    let (a, b, c) = (line[0], line[1], line[2])

    dist[a][b] = min(dist[a][b], c)
}


// 플로이드
for k in 1...n {
for i in 1...n {
for j in 1...n {
dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])
}
}
}

// 출력
for i in 1...n {
var row: [String] = []
for j in 1...n {
if dist[i][j] == INF {
row.append("0")
} else {
row.append(String(dist[i][j]))
}
}
print(row.joined(separator: " "))
}
Comment on lines +40 to +50
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

반복문 내에서 print를 여러 번 호출하는 대신, mapjoined를 사용하여 전체 결과를 하나의 문자열로 구성한 뒤 한 번에 출력하는 것이 성능 면에서 더 유리합니다.

let result = (1...n).map { i in
    (1...n).map { j in
        dist[i][j] == INF ? "0" : String(dist[i][j])
    }.joined(separator: " ")
}.joined(separator: "\n")
print(result)