Skip to content

Commit 27c8357

Browse files
committed
[Gold III] Title: 불우이웃돕기, Time: 8 ms, Memory: 69312 KB -BaekjoonHub
1 parent 557398e commit 27c8357

2 files changed

Lines changed: 115 additions & 0 deletions

File tree

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# [Gold III] 불우이웃돕기 - 1414
2+
3+
[문제 링크](https://www.acmicpc.net/problem/1414)
4+
5+
### 성능 요약
6+
7+
메모리: 69312 KB, 시간: 8 ms
8+
9+
### 분류
10+
11+
그래프 이론, 문자열, 최소 스패닝 트리
12+
13+
### 제출 일자
14+
15+
2025년 9월 11일 10:43:19
16+
17+
### 문제 설명
18+
19+
<p>다솜이는 불우이웃 돕기 활동을 하기 위해 무엇을 할지 생각했다. 마침 집에 엄청나게 많은 랜선이 있다는 것을 깨달았다. 마침 랜선이 이렇게 많이 필요 없다고 느낀 다솜이는 랜선을 지역사회에 봉사하기로 했다.</p>
20+
21+
<p>다솜이의 집에는 N개의 방이 있다. 각각의 방에는 모두 한 개의 컴퓨터가 있다. 각각의 컴퓨터는 랜선으로 연결되어 있다. 어떤 컴퓨터 A와 컴퓨터 B가 있을 때, A와 B가 서로 랜선으로 연결되어 있거나, 또 다른 컴퓨터를 통해서 연결이 되어있으면 서로 통신을 할 수 있다.</p>
22+
23+
<p>다솜이는 집 안에 있는 N개의 컴퓨터를 모두 서로 연결되게 하고 싶다.</p>
24+
25+
<p>N개의 컴퓨터가 서로 연결되어 있는 랜선의 길이가 주어질 때, 다솜이가 기부할 수 있는 랜선의 길이의 최댓값을 출력하는 프로그램을 작성하시오.</p>
26+
27+
### 입력
28+
29+
<p>첫째 줄에 컴퓨터의 개수 N이 주어진다. 둘째 줄부터 랜선의 길이가 주어진다. i번째 줄의 j번째 문자가 0인 경우는 컴퓨터 i와 컴퓨터 j를 연결하는 랜선이 없음을 의미한다. 그 외의 경우는 랜선의 길이를 의미한다. 랜선의 길이는 a부터 z는 1부터 26을 나타내고, A부터 Z는 27부터 52를 나타낸다. N은 50보다 작거나 같은 자연수이다.</p>
30+
31+
### 출력
32+
33+
<p>첫째 줄에 다솜이가 기부할 수 있는 랜선의 길이의 최댓값을 출력한다. 만약, 모든 컴퓨터가 연결되어 있지 않으면 -1을 출력한다.</p>
34+
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
struct Edge {
2+
let from: Int
3+
let to: Int
4+
let cost: Int
5+
}
6+
7+
let n = Int(readLine()!)!
8+
var edges = [Edge]()
9+
var parent = Array(0..<n)
10+
var answer = 0
11+
12+
for i in 0..<n {
13+
let line = readLine()!.map { $0.toNum }
14+
for j in 0..<n {
15+
if line[j] == 0 { continue }
16+
edges.append( Edge(from: i, to: j, cost: line[j]))
17+
answer += line[j]
18+
}
19+
}
20+
21+
edges.sort { $0.cost < $1.cost }
22+
23+
for edge in edges {
24+
let g = edge.from
25+
let v = edge.to
26+
let cost = edge.cost
27+
28+
if find(g) == find(v) {
29+
continue
30+
}
31+
union(g, v)
32+
answer -= cost
33+
}
34+
35+
for i in 0..<n {
36+
_=find(i)
37+
}
38+
39+
if Set(parent).count > 1 {
40+
answer = -1
41+
}
42+
43+
print(answer)
44+
45+
func union(_ g: Int, _ v: Int) {
46+
var parentG = find(g)
47+
var parentV = find(v)
48+
49+
if parentV > parentG {
50+
swap(&parentG, &parentV)
51+
}
52+
53+
parent[parentV] = parentG
54+
}
55+
56+
func find(_ g: Int) -> Int {
57+
if parent[g] == g {
58+
return parent[g]
59+
}
60+
let parentG = find(parent[g])
61+
parent[g] = parentG
62+
63+
return parent[g]
64+
}
65+
66+
extension Character {
67+
var toNum: Int {
68+
if self == "0" { return 0 }
69+
guard let asciiValue = self.asciiValue else { return -1 }
70+
71+
if 97...122 ~= asciiValue {
72+
return Int(asciiValue - 96)
73+
}
74+
75+
if 65...90 ~= asciiValue {
76+
return Int(asciiValue - 38)
77+
}
78+
79+
return -1
80+
}
81+
}

0 commit comments

Comments
 (0)