-
Q. 5567 자바 : 결혼식코딩테스트/백준_Java 2023. 4. 12. 09:23
Q. 5567 자바 : 결혼식
문제 : boj.kr/5567
실버 2 난이도의 문제이다.
간선이 주어지고 탐색을 통해 깊이가 2인 정점까지 방문 가능하다면 몇 개의 정점을 방문 가능한지 세는 문제이다.
(상근이의 친구 - 깊이가 1, 친구의 친구 - 깊이가 2)
간선만 주어지므로 격자형 그래프가 아니라 ArrayList를 사용해서 문제를 해결했다.
또한 양방향 그래프이므로 간선을 입력받을 때 두 정점 모두 표시했다.
이 문제의 경우 아래와 같은 방식으로 해결했다.
1. 입력값을 받아 두 정점에 저장한다.
2. 깊이우선탐색(DFS)를 시작한다.
3. 이 때 주의해야 할 점은 깊이가 2일 때 까지 모든 정점을 탐색해야 하므로 방문 여부 확인은 하되, 이미 방문한 정점에 대해서도 탐색한다.
(어떤 사람에게는 친구의 친구이지만, 다른 사람에게는 친구일 수 있다.)
이 문제의 경우 정점 n이 최대 500개, 간선m이 최대 10,000개이다.
리스트를 사용한 일반 그래프의 시간복잡도는 O(n + m)으로 시간초과는 걱정하지 않아도 된다.
또한 자료형 역시 int 범위 내에서 모두 해결할 수 있다.
풀이는 아래와 같다.
import java.io.*; import java.util.*; public class Main { static FastReader scan = new FastReader(); static StringBuilder sb = new StringBuilder(); static int M, N, cnt = -1; static List<Integer>[] list; static boolean[] visit; static int[] dy = {0, 1, 0, -1}; static int[] dx = {1, 0, -1, 0}; static void input() { N = scan.nextInt(); M = scan.nextInt(); list = new List[N + 1]; visit = new boolean[N + 1]; for (int i = 1; i <= N; i++) { list[i] = new LinkedList<>(); } for (int i = 0; i < M; i++) { int s = scan.nextInt(); int e = scan.nextInt(); list[s].add(e); list[e].add(s); } } static void dfs(int start, int depth) { if (!visit[start]) { visit[start] = true; cnt++; } if (depth == 2) return; for (int end: list[start]) { dfs(end, depth + 1); } } static void pro() { dfs(1, 0); System.out.println(cnt); } public static void main(String[] args) { input(); pro(); } static class FastReader { // BufferedReader의 빠른 속도, // + Scanner의 타입별 입력값을 받는 기능을 혼합 // (자바 내부에 구현된 Scanner는 속도가 느림) // 다른분의 코드를 참고한 코드 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. 20364 자바 : 부동산 다툼 (0) 2023.04.15 Q. 15900 자바 : 나무 탈출 (0) 2023.04.14 Q. 18404 자바 : 현명한 나이트 (2) 2023.04.11 Q. 7562 자바 : 나이트의 이동 (0) 2023.04.10 Q. 3055 자바 : 탈출 (0) 2023.04.09