알고리즘/알고리즘 문제풀이
그래프_백준_11724 swift
Downey
2022. 1. 25. 18:48
https://www.acmicpc.net/problem/11724
11724번: 연결 요소의 개수
첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주
www.acmicpc.net
문제접근
- 1...N의 정점, 첫번째 (1) 부터 반복문 수행
- 중복 여부 검사 후( visited에 있는가? 여부), 간선 연결됨 +1 (connected+=1)
- dfs하여 1과 연결된 모든 정점 탐색 및 visited에 insert
- 1번의 반복문을 이어서 시행 -> visited에 포함된 요소들은 건너 뜀 continue
testcase
더보기
let firstInput = "6 5" // answer :2
let inputList = ["1 2",
"2 5",
"5 1",
"3 4",
"4 6"]
let secondInput = "6 8" //1
let inputList2 = ["1 2",
"2 5",
"5 1",
"3 4",
"4 6",
"5 4",
"2 4",
"2 3"]
let thirdInput = "6 2" //4
let inputList3 =
["3 4",
"4 2"]
정답
메모리 | 시간 |
104280KB | 2216ms |
더보기
class Baek11724 {
struct Connection {
let left: Int
let right: Int
}
var connected = 0
var connections = [Connection]()
var visited: Set<Int> = []
func start(_ N: Int, _ input: [String]) {
var wholeNums = Set<Int>()
for i in 1...N {
wholeNums.insert(i)
}
for str in input {
let intArr = str.components(separatedBy: .whitespaces).map({Int($0)!})
connections.append(Connection.init(left: intArr[0], right: intArr[1]))
}
for num in wholeNums.sorted() {
if !visited.insert(num).inserted {
continue
}
print(visited)
connected += 1
dfs(num)
}
wholeNums.subtract(visited)
connected += wholeNums.count
print(connected, wholeNums.count)
}
func dfs(_ num: Int) {
for conn in connections {
if conn.left == num && !visited.contains(conn.right) {
visited.insert(conn.right)
dfs(conn.right)
}
if conn.right == num && !visited.contains(conn.left) {
visited.insert(conn.left)
dfs(conn.left)
}
}
}
}