BOJ 2606 바이러스
접근 방식
1번 컴퓨터와 연결된 컴퓨터 수를 세는 문제. (solved.ac 기준 실버 3)
인접 리스트로 그래프를 만들고 1번에서 DFS로 도달 가능한 노드를 셈. 시작 노드 1은 감염 대상이 아니므로 방문 수에서 하나를 빼고 출력함(a.count - 1).
주의할 점은 입력을 받는 부분. 그래프는 간선이 양방향이라 서로가 서로를 인접 리스트에 담아야 함. [Int: [Int]] 형태로 받을 때, 2번과 5번이 서로 연결돼 있다면
- 2: [1,3,5]
- 5: [1,2,6]
처럼 양쪽 모두에 넣어야 함. 트리처럼 한 방향만 담다가 종종 실수함.

나는 DFS로 풀었는데 BFS를 사용해도 상관없음.
코드
import Foundation
struct b2606 {
static func run() {
// Input 처리
var n = Int(readLine()!)!
var input = Int(readLine()!)!
var list = [Int: [Int]]()
for _ in 0..<input {
let line = readLine()!.split(separator: " ").map{ Int(String($0))! }
let start = line[0]
let end = line[1]
if list[start] == nil {
list[start] = [end]
} else {
list[start]?.append(end)
}
if list[end] == nil {
list[end] = [start]
} else {
list[end]?.append(start)
}
}
// print(list)
let a = DFS(graph: list, start: 1)
print(a.count-1)
}
}
import Foundation
func DFS<T> (graph: [T: [T]], start: T) -> [T] {
var visitedQueue: [T] = []
var needVisitStack: [T] = [start]
while !needVisitStack.isEmpty {
let node: T = needVisitStack.removeLast()
if visitedQueue.contains(node) { continue }
visitedQueue.append(node)
needVisitStack += graph[node] ?? []
}
return visitedQueue
}'알고리즘 문제 풀이' 카테고리의 다른 글
| [Swift] BOJ 2667 단지번호붙이기 (0) | 2022.04.03 |
|---|---|
| [Swift] BOJ 1012 유기농 배추 (0) | 2022.04.03 |
| [Swift] BOJ 2178 미로 탐색 (0) | 2022.04.02 |
| [Swift] BOJ 10844 쉬운 계단 수 (0) | 2022.04.02 |
| [Swift] BOJ 2156 포도주 시식 (0) | 2022.04.02 |