Skip to content

Commit cbbdf46

Browse files
committed
[Gold IV] Title: 학회원, Time: 32 ms, Memory: 79520 KB -BaekjoonHub
1 parent ce9a4ba commit cbbdf46

2 files changed

Lines changed: 108 additions & 0 deletions

File tree

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# [Gold IV] 학회원 - 3865
2+
3+
[문제 링크](https://www.acmicpc.net/problem/3865)
4+
5+
### 성능 요약
6+
7+
메모리: 79520 KB, 시간: 32 ms
8+
9+
### 분류
10+
11+
자료 구조, 그래프 이론, 문자열, 그래프 탐색, 집합과 맵, 너비 우선 탐색, 깊이 우선 탐색, 해시를 사용한 집합과 맵, 파싱
12+
13+
### 제출 일자
14+
15+
2026년 3월 9일 09:41:44
16+
17+
### 문제 설명
18+
19+
<p>상근이는 Sogang ACM-ICPC Team의 회장이다. 서강대학교 컴퓨터 학생들은 하나 또는 그 이상의 학회에 소속되어 있다. 상근이는 학생들이 어떤 학회에 소속되어 있는지 조사해보려고 한다.</p>
20+
21+
<p>상근이는 학회원의 정보를 다음과 같이 작성한다. 아래 예시는 sisobus와 weissblume은 icpc의 학회원이라는 뜻이다.</p>
22+
23+
<pre>icpc:weissblume,sisobus.</pre>
24+
25+
<p>콜론(:)의 앞에는 학회의 이름이 쓰여 있고, 뒤에는 학회원이 주어진다.</p>
26+
27+
<p>어떤 학회는 모든 회원이 다른 학회에 소속되어 있을 수도 잇다. 따라서, 학회원을 적는 곳에 학회의 이름을 적을 수도 있다.</p>
28+
29+
<pre>slug:sisobus,minhyeok,icpc,exupery.</pre>
30+
31+
<p>icpc에 소속되어 있는 사람은 slug에도 소속되어 있다는 뜻이다. 즉, slug의 학회원은 아래와 같다.</p>
32+
33+
<pre>slug:sisobus,minhyeok,weissblume,sisobus,exupery.</pre>
34+
35+
<p>이 경우에 sisobus는 두 번 등장한다. 중복되는 사람의 이름을 하나로 줄이게 되면, 아래와 같이 하나로 줄여서 작성할 수 있다.</p>
36+
37+
<pre>slug:sisobus,minhyeok,weissblume,exupery.</pre>
38+
39+
<p>학회의 회원 정보가 주어졌을 때, 각 학회의 학회원이 몇 명인지 구하는 프로그램을 작성하시오.</p>
40+
41+
<p>상근이가 작성하는 방법에는 학회의 이름이 중첩될 수도 있다. 아래 예시에서 one에 소속된 회원은 abckhw 한 명이다.</p>
42+
43+
<pre>one:another.
44+
another:yetanother.
45+
yetanother:abckhw.</pre>
46+
47+
### 입력
48+
49+
<p>입력은 여러 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 학회의 수 n이 주어진다. n은 100을 넘지 않는 양의 정수이다. 다음 n개 줄에는 각 학회의 학회원 정보가 문제에서 설명한 형식으로 주어진다. 콜론(:) 앞은 학회 이름이고, 그 뒤쪽은 회원의 이름이 콤마(,)로 구분되어져 있다. 각 정보의 마지막에는 마침표(.)가 하나 주어진다.</p>
50+
51+
<p>학회의 이름은 서로 다르다. 학회원 정보에서 주어지는 회원이 학회 이름이 아닌 경우에는 사람의 이름이다.</p>
52+
53+
<p>입력으로 주어지는 학회 정보에서 순환을 이루는 정보는 없다.</p>
54+
55+
<p>각 그룹 또는 사람의 이름은 비어있지 않은 문자열이며, 길이가 1과 15 사이이다. 또, 알파벳 소문자로만 이루어져 있다.</p>
56+
57+
<p>각 학회에 속한, 그룹이나 사람의 수는 1 이상 10 이하이다.</p>
58+
59+
<p>입력의 마지막 줄에는 0이 하나 주어진다.</p>
60+
61+
### 출력
62+
63+
<p>각 테스트 케이스에 대해서, 제일 처음으로 주어지는 학회에 포함되어 있는 회원의 수를 출력한다.</p>
64+
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import Foundation
2+
3+
while true {
4+
let n = Int(readLine()!)!
5+
if n == 0 { break }
6+
7+
var groups = [String: [String]]()
8+
var firstGroup = ""
9+
10+
for i in 0..<n {
11+
let line = readLine()!
12+
let parts = line.dropLast().split(separator: ":")
13+
let group = String(parts[0])
14+
let members = parts[1].split(separator: ",").map { String($0) }
15+
16+
groups[group] = members
17+
18+
if i == 0 {
19+
firstGroup = group
20+
}
21+
}
22+
23+
var visitedGroups = Set<String>()
24+
var people = Set<String>()
25+
26+
func dfs(_ group: String) {
27+
if visitedGroups.contains(group) { return }
28+
visitedGroups.insert(group)
29+
30+
guard let members = groups[group] else { return }
31+
32+
for m in members {
33+
if groups[m] != nil {
34+
dfs(m)
35+
} else {
36+
people.insert(m)
37+
}
38+
}
39+
}
40+
41+
dfs(firstGroup)
42+
43+
print(people.count)
44+
}

0 commit comments

Comments
 (0)