백준 2606 바이러스
https://www.acmicpc.net/problem/2606
문제
신종 바이러스인 웜 바이러스는 네트워크를 통해 전파된다. 한 컴퓨터가 웜 바이러스에 걸리면 그 컴퓨터와 네트워크 상에서 연결되어 있는 모든 컴퓨터는 웜 바이러스에 걸리게 된다.
예를 들어 7대의 컴퓨터가 <그림 1>과 같이 네트워크 상에서 연결되어 있다고 하자. 1번 컴퓨터가 웜 바이러스에 걸리면 웜 바이러스는 2번과 5번 컴퓨터를 거쳐 3번과 6번 컴퓨터까지 전파되어 2, 3, 5, 6 네 대의 컴퓨터는 웜 바이러스에 걸리게 된다. 하지만 4번과 7번 컴퓨터는 1번 컴퓨터와 네트워크상에서 연결되어 있지 않기 때문에 영향을 받지 않는다.
어느 날 1번 컴퓨터가 웜 바이러스에 걸렸다. 컴퓨터의 수와 네트워크 상에서 서로 연결되어 있는 정보가 주어질 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어진다. 이어서 그 수만큼 한 줄에 한 쌍씩 네트워크 상에서 직접 연결되어 있는 컴퓨터의 번호 쌍이 주어진다.
DFS 문제를 풀어보려고 했는데, 어떻게 푸는지 하나도 기억이 안나서 쉬운 것부터 먼저 풀어봤다..
일단 배열로 visited 체크 해주는 건 기억이 나서, 이차원 배열로 만들어줬다. (여기서는 연결 되어있음을 체크!)
감염된 컴퓨터 갯수를 체크해줄 check 배열도 만들었다.
connect = new boolean[N + 1][N + 1];
check = new boolean[N + 1];
입력이 3 4 라면 어차피 두 개가 이어져있는 것이고, 그래프로 생각하면 무방향이기 때문에 3 4, 4 3 둘 다 연결되어 있음을 true로 바꿨다.
for (int i = 0; i < num; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
connect[a][b] = true;
connect[b][a] = true;
}
1번 컴퓨터는 무조건 감염되어 있으니까 true로 미리 바꿔두고 dfs함수를 호출해야한다.
check[1] = true;
dfs(1);
호출한 dfs 함수는 아래처럼 작성했는데, 지금 보니 check[i] = true 는 없어도 될듯하다. 어차피 앞에 있는 컴퓨터가 뒤 컴퓨터를 감염시키는 것이기 때문에, 새로 감염된 컴퓨터는 j가 되기 때문!
private static void dfs(int virus){
for(int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
if (connect[i][j] && i == virus) {
check[i] = true;
check[j] = true;
connect[i][j] = false;
connect[j][i] = false;
dfs(j);
}
}
}
}
작년에 풀었던 건 BFS로 풀었던데 BFS도 사실 기억 안나서 접근할 시도조차 안함..ㅎ
런타임 에러는 배열 초기화를 잘 못 했고, 출력 초과는 IDE에서 디버깅하는 과정 좀 찍었던 걸 그대로 제출해버렸다.
맞을 것 같은 확신이 들면 들떠서 맨날 그대로 내버린다😅
생각보다 시간이 오래 걸려서 '감이 떨어졌나' 싶은 정도가 아니라 '나 왜이래'라고 생각할 정도였다..
그래도 완벽하게 이해한 것 같아서 다행🥹
제 정답 코드는 아래와 같습니다!
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BOJ2606 {
static int N, num, cnt = 0;
static boolean[] check;
static boolean[][] connect;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
N = Integer.parseInt(br.readLine());
num = Integer.parseInt(br.readLine());
connect = new boolean[N + 1][N + 1];
check = new boolean[N + 1];
for (int i = 0; i < num; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
connect[a][b] = true;
connect[b][a] = true;
}
check[1] = true;
dfs(1);
for(int i = 2; i <= N; i++){
if(check[i]){
cnt++;
}
}
System.out.println(cnt);
}
private static void dfs(int virus){
for(int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
if (connect[i][j] && i == virus) {
//check[i] = true;
check[j] = true;
connect[i][j] = false;
connect[j][i] = false;
dfs(j);
}
}
}
}
}
'Algorithm' 카테고리의 다른 글
[TIL] Queue, ArrayList가 아닌 LinkedList사용 이유 (0) | 2023.04.13 |
---|---|
[BOJ24479] 알고리즘 수업 - 깊이 우선 탐색 1 (0) | 2023.04.12 |
[SQL] SQL 코딩 테스트 준비 (0) | 2023.04.10 |
[BOJ 14888] 연산자 끼워넣기 (0) | 2023.04.07 |
[BOJ15649] N과 M (1) (0) | 2023.04.07 |