-
그래프_백준_11724 swift알고리즘/알고리즘 문제풀이 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) } } } }
'알고리즘 > 알고리즘 문제풀이' 카테고리의 다른 글
hash,string,sort_LeetCode_49.GroupAnangram swift (0) 2022.02.21 카카오_프로그래머스_거리두기 확인하기 swift (0) 2022.02.21 행렬_Leetcode_130.Surrounded Region Swift (0) 2022.01.25 행렬_백준_1012 (0) 2022.01.25 행렬_LeetCode_542 01matrix (0) 2022.01.24