Skip to content

Commit 5d8051c

Browse files
committed
[Gold II] Title: 친구 네트워크, Time: 628 ms, Memory: 116536 KB -BaekjoonHub
1 parent 209b8eb commit 5d8051c

File tree

2 files changed

+84
-0
lines changed

2 files changed

+84
-0
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# [Gold II] 친구 네트워크 - 4195
2+
3+
[문제 링크](https://www.acmicpc.net/problem/4195)
4+
5+
### 성능 요약
6+
7+
메모리: 116536 KB, 시간: 628 ms
8+
9+
### 분류
10+
11+
자료 구조, 집합과 맵, 해시를 사용한 집합과 맵, 분리 집합
12+
13+
### 제출 일자
14+
15+
2025년 5월 24일 10:22:24
16+
17+
### 문제 설명
18+
19+
<p>민혁이는 소셜 네트워크 사이트에서 친구를 만드는 것을 좋아하는 친구이다. 우표를 모으는 취미가 있듯이, 민혁이는 소셜 네트워크 사이트에서 친구를 모으는 것이 취미이다.</p>
20+
21+
<p>어떤 사이트의 친구 관계가 생긴 순서대로 주어졌을 때, 두 사람의 친구 네트워크에 몇 명이 있는지 구하는 프로그램을 작성하시오.</p>
22+
23+
<p>친구 네트워크란 친구 관계만으로 이동할 수 있는 사이를 말한다.</p>
24+
25+
### 입력
26+
27+
<p>첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스의 첫째 줄에는 친구 관계의 수 F가 주어지며, 이 값은 100,000을 넘지 않는다. 다음 F개의 줄에는 친구 관계가 생긴 순서대로 주어진다. 친구 관계는 두 사용자의 아이디로 이루어져 있으며, 알파벳 대문자 또는 소문자로만 이루어진 길이 20 이하의 문자열이다.</p>
28+
29+
### 출력
30+
31+
<p>친구 관계가 생길 때마다, 두 사람의 친구 네트워크에 몇 명이 있는지 구하는 프로그램을 작성하시오.</p>
32+
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
func solution() {
2+
let n = Int(readLine()!)!
3+
var parent = [String: String]()
4+
var level = [String: Int]()
5+
var relations = [String]()
6+
7+
for _ in 0..<n {
8+
relations.append(readLine()!)
9+
}
10+
11+
for relation in relations {
12+
let names = relation.split(separator: " ").map { String($0) }
13+
parent[names[0]] = names[0]
14+
parent[names[1]] = names[1]
15+
level[names[0]] = 1
16+
level[names[1]] = 1
17+
}
18+
19+
for relation in relations {
20+
let names = relation.split(separator: " ").map { String($0) }
21+
union(names[0], names[1])
22+
print(level[find(names[0])]!)
23+
}
24+
25+
func find(_ name: String) -> String {
26+
if parent[name]! == name {
27+
return name
28+
}
29+
parent[name] = find(parent[name]!)
30+
return parent[name]!
31+
}
32+
33+
func union(_ n1: String, _ n2: String) {
34+
let n1 = find(n1)
35+
let n2 = find(n2)
36+
37+
if n1 == n2 {
38+
return
39+
}
40+
if n1 > n2 {
41+
parent[n1] = n2
42+
} else {
43+
parent[n2] = n1
44+
}
45+
let maxLevel = level[n1]! + level[n2]!
46+
level[n1]! = maxLevel
47+
level[n2]! = maxLevel
48+
}
49+
}
50+
51+
let t = Int(readLine()!)!
52+
(0..<t).forEach { _ in solution() }

0 commit comments

Comments
 (0)