-
[1976] 여행 가자 - Java[자바]자바/백준 2023. 9. 16. 23:53
| 문제 링크
https://www.acmicpc.net/problem/1976
1976번: 여행 가자
동혁이는 친구들과 함께 여행을 가려고 한다. 한국에는 도시가 N개 있고 임의의 두 도시 사이에 길이 있을 수도, 없을 수도 있다. 동혁이의 여행 일정이 주어졌을 때, 이 여행 경로가 가능한 것인
www.acmicpc.net
| 문제
- 첫째 줄에 n개의 도시가 있고, m개의 도시를 여행하고자 합니다.
- n개의 줄에 n개의 숫자(0 or 1)각 주어집니다.
- i번째 줄은 i번째 도시를 뜻하며, 해당 줄에 j번째 숫자는 j번째 도시를 의미합니다.
0은 연결되지 않음 1은 연결됨 - 마지막 줄에 m개의 숫자(도시)가 나오며, 해당 도시들을 여행할 수 있으면(연결된 도시들을 몇 개를 거쳐가든 괜찮습니다.) YES, 여행할 수 없으면 NO를 출력하시오
| 풀이
- 여행하고자 하는 도시들이 연결되어 있는지 확인을 해야합니다.
- 각 노드(도시)들의 공통 조상(그래프에 속한 노드들 중 낮은 숫자를 조상으로 설정)을 구해 모두 같은 경우 YES, 다른 경우에는 NO를 출력하는 문제입니다.
- 각 노도들의 공통 조상을 구하기 위해 유니온 파인드 알고리즘을 사용합니다.
- 우선 각 노들들의 조상을 자기 자신으로 설정합니다.
- 입력값으로 두 도시(a, b라 설정)가 연결된 경우(1이 들어오는 경우) a와 b의 조상 노드를 확인해 더 낮은 조상 노드로 바꾸며 입력값을 전부 확인합니다.
- 여행하고자 하는 도시들의 조상 노드가 동일한 경우 YES, 아닌 경우 NO를 출력합니다.
| 코드
import java.io.*; import java.util.StringTokenizer; public class Main { public static int[] parent; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); StringTokenizer st; int n = Integer.parseInt(br.readLine()); int m = Integer.parseInt(br.readLine()); parent = new int[n+1]; //노드 자기 자신을 부모로 초기화 for (int i = 1; i <= n; i++) { parent[i] = i; } for (int i = 1; i <= n; i++) { st = new StringTokenizer(br.readLine()); for (int j = 1; j <= n; j++) { int node = Integer.parseInt(st.nextToken()); //도시끼리 길이 이어져 있을 경우 조상을 하나로 통일한다. if (node == 1) union(i,j); } } //방문 하고자 하는 도시들의 조상이 같은 경우에는 어떤 경로를 거치든 방문이 가능하나 //조상이 다른 경우에는 이동할 수 없다. 즉 도시 하나씩 조상을 꺼내어 비교해 다 같은 경우 YES, 다른 경우 NO 출력 st = new StringTokenizer(br.readLine()); String answer = "YES"; int top = top(Integer.parseInt(st.nextToken())); while(st.hasMoreTokens()) { int top2 = top(Integer.parseInt(st.nextToken())); if(top!=top2) { answer="NO"; break; } } bw.write(answer); br.close(); bw.close(); } //해당 노드의 조상을 불러와서 공통된 조상인 경우 이동이 가능하다 판단 public static int top(int a) { if(a==parent[a]) return a; parent[a]=top(parent[a]); return parent[a]; } //a와 b가 이어져 있을 경우 조상을 통일해 준다. 이때 숫자가 더 낮은 조상이 조상이 되는게 국룰이다. public static void union(int a, int b) { int topA = top(a); int topB = top(b); //a보다 b가 큰 경우 b의 조상은 a의 조상 if(topA<topB) parent[topB]=topA; else parent[topA]=topB; } }
'자바 > 백준' 카테고리의 다른 글
[5675] 음주 코딩 - Java[자바] (0) 2023.09.22 [1261] 알고스팟 - Java[자바] (0) 2023.09.17 [1520] 내리막 길 - Java[자바] (0) 2023.09.13 [2206] 벽 부수고 이동하기 - Java[자바] (0) 2023.09.13 [7569] 토마토 - Java[자바] (0) 2023.09.12