-
Q. 2606 바이러스코딩테스트/백준_Java 2023. 4. 4. 09:04
Q. 2606 바이러스
문제 : boj.kr/2606
실버 3 난이도의 문제이다.
컴퓨터의 수와 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어지고
이후에 연결된 컴퓨터 쌍이 주어진다
이 때 1번 컴퓨터가 바이러스에 걸렸다면, 1번 컴퓨터를 통해 바이러스에 걸리게 되는 컴퓨터의 수를 계산하는 문제이다.
이를 그래프로 설명하자면
양방향 그래프가 주어지고 정점과 간선의 수 그리고 간선이 주어진다.
이 때 1번 정점에 연결된 다른 정점의 수를 계산하는 문제이다.
그래프와 연결된 간선을 List로 구현한 뒤 dfs, bfs 두 방식으로 풀었다
List를 이용한 그래프 탐색의 경우
정점을 V, 간선을 E라고 하면 시간복잡도가 O(V + E)이고
문제 조건에서 정점이 최대 100개이므로 이 경우 간선이 4950개 나올 수 있다.
따라서 약 5050번 계산하면 문제를 풀 수 있으므로 상수 시간 안에 이 문제를 해결할 수 있다.
(정점이 최대 100개일 경우 간선의 수는 99 + 98 + 97 + .... + 3 + 2 + 1 = 100 * 50 = 4950)내 풀이는 아래와 같다
import java.io.*; import java.util.*; public class Main { static FastReader scan = new FastReader(); static StringBuilder sb = new StringBuilder(); static int V, E; static List<Integer>[] list; static boolean[] visit; static int res = 0; static void input() { V = scan.nextInt(); E = scan.nextInt(); visit = new boolean[V + 1]; list = new List[V + 1]; for (int i = 1; i <= V; i++) list[i] = new ArrayList<>(); for (int i = 0; i < E; i++) { int s = scan.nextInt(); int e = scan.nextInt(); list[s].add(e); list[e].add(s); } } static int bfs() { int cnt = 0; Queue<Integer> que = new LinkedList<>(); visit[1] = true; for (int v: list[1]) { que.add(v); visit[v] = true; } while (!que.isEmpty()) { int v = que.poll(); cnt++; for (int i: list[v]) { if (!visit[i]) { que.add(i); visit[i] = true; } } } return cnt; } static void dfs(int v) { visit[v] = true; for (int i: list[v]) { if (!visit[i]) { res++; dfs(i); } } } static void pro() { // System.out.println(bfs()); dfs(1); System.out.println(res); } public static void main(String[] args) { input(); pro(); } static class FastReader { BufferedReader br; StringTokenizer st; public FastReader() { br = new BufferedReader(new InputStreamReader(System.in)); } public FastReader(String s) throws FileNotFoundException { br = new BufferedReader(new FileReader(new File(s))); } String next() { while (st == null || !st.hasMoreElements()) { try { st = new StringTokenizer(br.readLine()); } catch (IOException e) { e.printStackTrace(); } } return st.nextToken(); } int nextInt() { return Integer.parseInt(next()); } long nextLong() { return Long.parseLong(next()); } double nextDouble() { return Double.parseDouble(next()); } String nextLine() { String str = ""; try { str = br.readLine(); } catch (IOException e) { e.printStackTrace(); } return str; } } }
반응형'코딩테스트 > 백준_Java' 카테고리의 다른 글
Q. 11725 자바 : 트리의 부모 찾기 (0) 2023.04.06 Q. 11403 자바 : 경로 찾기 (0) 2023.04.05 Q. 14502 연구소 (0) 2023.04.03 Q. 3184 자바 : 양 (0) 2023.04.02 Q. 4963 자바 : 섬의 개수 (0) 2023.04.01