본문 바로가기
코딩 테스트

2606번 바이러스(자바, java) - DFS

by 주용사 2023. 1. 9.
728x90

런타임(인덱스 아웃) 에러가 떳었는데 문제는 배열사이즈 때문임. computer와 n 두개 받을때 혼동말것

 
import java.io.*;
import java.util.*;

public class Main {

	public static int count = 0;
	public static void main(String[] args) throws IOException {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());

		int computer = Integer.parseInt(st.nextToken());
		
		st = new StringTokenizer(br.readLine());
		int n = Integer.parseInt(st.nextToken());
		
		int[][] matrix = new int[computer+1][computer+1];
		boolean[] visited = new boolean[computer+1]; /* 컴퓨터 개수 만큼 1차원 배열로 방문했는지 체크하면됨 */
		
		for(int ii = 0 ; ii < n ; ii++)
		{
			st = new StringTokenizer(br.readLine());
			int x = Integer.parseInt(st.nextToken());
			int y = Integer.parseInt(st.nextToken());
			
			/* 1은 연결되어있다는 의미고 양쪽방향 둘다 연결시켜준다. */
			matrix[x][y] = 1;
			matrix[y][x] = 1;
		}
		
	
		/* 1번 컴퓨터 시작 */
		dfs(computer, 1, matrix, visited);
		
		/* 1을 뺀 이유는 dfs에서 1번 컴퓨터부터 카운트되기때문임(제외시킬려고) */
		System.out.println(count-1);
		
		br.close();
	}
	
	public static boolean dfs(int computer, int start, int[][] matrix, boolean[] visited)
	{
		if(visited[start] == true) /* 방문했다면 탈출 */
			return false;
		
		visited[start] = true; /* 방문 체크 및 감염된 컴퓨터 개수 카운팅 */
		count++;
		
		for(int ii = 1 ; ii < computer+1 ; ii++)
		{
			if(matrix[start][ii] == 1) /* 루프를 돌아서 연결되어있다면 바이러스 감염시키러 들어간다 */
			{
				dfs(computer, ii, matrix, visited);
			}
		}
		
		return true;
	}
	
	
}

https://www.acmicpc.net/problem/2606

728x90