2023. 2. 18. 20:43ㆍALGORITHM/Swift
문제링크
2606번: 바이러스
첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어
www.acmicpc.net
문제
신종 바이러스인 웜 바이러스는 네트워크를 통해 전파된다. 한 컴퓨터가 웜 바이러스에 걸리면 그 컴퓨터와 네트워크 상에서 연결되어 있는 모든 컴퓨터는 웜 바이러스에 걸리게 된다.
예를 들어 7대의 컴퓨터가 <그림 1>과 같이 네트워크 상에서 연결되어 있다고 하자. 1번 컴퓨터가 웜 바이러스에 걸리면 웜 바이러스는 2번과 5번 컴퓨터를 거쳐 3번과 6번 컴퓨터까지 전파되어 2, 3, 5, 6 네 대의 컴퓨터는 웜 바이러스에 걸리게 된다. 하지만 4번과 7번 컴퓨터는 1번 컴퓨터와 네트워크상에서 연결되어 있지 않기 때문에 영향을 받지 않는다.
![](https://blog.kakaocdn.net/dn/b6EMct/btrZQcTNQTA/jKLEsKWFKis3vtnVaF1rFk/img.png)
어느 날 1번 컴퓨터가 웜 바이러스에 걸렸다. 컴퓨터의 수와 네트워크 상에서 서로 연결되어 있는 정보가 주어질 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어진다. 이어서 그 수만큼 한 줄에 한 쌍씩 네트워크 상에서 직접 연결되어 있는 컴퓨터의 번호 쌍이 주어진다.
출력
1번 컴퓨터가 웜 바이러스에 걸렸을 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 첫째 줄에 출력한다.
![](https://blog.kakaocdn.net/dn/dlWauR/btrZJdUdqTm/6E3MakNIFaHWqYbA5r18Lk/img.png)
분석
한 컴퓨터가 웜 바이러스에 걸리면 그 컴퓨터와 네트워크 상에서 연결되어 있는 모든 컴퓨터는 웜 바이러스에 걸린다.
네트워크가 연결되어있지 않으면 영향을 받지 않는다.
1번 컴퓨터가 웜 바이러스에 걸렸을 때 걸리게 되는 컴퓨터의 수를 출력하라
풀이 과정
첫째 줄 = 컴퓨터의 수
둘째 줄 = 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수
둘째 줄의 수만큼 반복 = 네트워크 상에서 직접 연결되어 있는 컴퓨터의 번호 쌍
풀이1 - DFS 이용
let inputComputer = Int(readLine()!)!
let inputNetword = Int(readLine()!)!
var checkArr = Array(repeating: false, count: inputComputer+1)
var arr = Array(repeating: Array(repeating: false, count: inputComputer+1), count: inputComputer+1)
for _ in 0..<inputNetword {
let line = readLine()!.split(separator: " ").map{ Int($0)!}
arr[line[0]][line[1]] = true
arr[line[1]][line[0]] = true
}
var count = 0
func dfs(_ num: Int) {
checkArr[num] = true
for i in 1..<inputComputer+1 {
if checkArr[i] == false && arr[num][i] == true {
dfs(i)
count += 1
}
}
}
//1번컴퓨터와 연결되어 있는 네트워크를 찾는 것
dfs(1)
print(count)
일단 입력받은 네트워크 연결을 배열에 저장해주고
1번 컴퓨터부터 순서대로 연결되어 있는 컴퓨터 번호에 방문한다.
풀이2 - BFS 이용
class Queue<T> {
var enQueue: [T]
var deQueue: [T] = []
var count: Int {
return enQueue.count + deQueue.count
}
var isEmpty: Bool {
return enQueue.isEmpty && deQueue.isEmpty
}
init(_ queue: [T]) {
self.enQueue = queue
}
func push(_ element: T) {
enQueue.append(element)
}
func pop() -> T {
if deQueue.isEmpty {
deQueue = enQueue.reversed()
enQueue.removeAll()
}
return deQueue.popLast()!
}
func front() -> T? {
let newQue = deQueue.reversed() + enQueue
return newQue.first
}
}
let inputComputer = Int(readLine()!)!
let inputNetword = Int(readLine()!)!
var checkArr = Array(repeating: false, count: inputComputer+1)
var arr = Array(repeating: Array(repeating: false, count: inputComputer+1), count: inputComputer+1)
for _ in 0..<inputNetword {
let line = readLine()!.split(separator: " ").map{ Int($0)!}
arr[line[0]][line[1]] = true
arr[line[1]][line[0]] = true
}
var count = 0
func bfs(_ num: Int) {
checkArr[num] = true
let q = Queue([Int]())
q.push(num)
while !q.isEmpty {
let last = q.pop()
for i in 1..<inputComputer+1 {
if checkArr[i] == false && arr[last][i] == true {
checkArr[i] = true
q.push(i)
count += 1
}
}
}
}
bfs(1)
print(count)
결과
DFS 이용 | BFS 이용 |
![]() |
|
![]() |
![]() |
알게된 점
이 문제는 해당 노드와 연결되어있는 노드의 개수를 구하는 문제
DFS 와 BFS를 반복적으로 연습중이다.
처음보다는 그래도 어느정도 개념이 잡히는 듯하다.
이제 풀이와 구현하는 정도는 가능해졌지만 어떤 방식이 더 효율적인지는 좀 더 많은 문제를 풀어봐야겠다.
'ALGORITHM > Swift' 카테고리의 다른 글
[알고리즘] Swift -백준 #1012(유기농 배추) -DFS (0) | 2023.02.19 |
---|---|
[알고리즘] Swift -백준 #2667(단지번호붙이기) -DFS (0) | 2023.02.18 |
[알고리즘] Swift -백준 #1260(DFS와 BFS) (1) | 2023.02.17 |
[알고리즘] Swift -백준 #11286(절댓값 힙) (1) | 2023.02.16 |
[알고리즘] Swift -백준 #2841(외계인의 기타 연주) (0) | 2023.02.15 |