https://www.acmicpc.net/problem/19763
푸는방법이 딱히 떠오르지 않아서 야매?같은 방법으로 풀었는데 의외로 쉽게 풀렸던 문제
유니온 파인드를 쓰는게 효율적일꺼같았지만 생각이 나지 않아서 그냥 bfs방식으로 풀었다.
또한 길에 대한 정보도 리스트로 관리하는게 더 효율적일꺼같았지만 그냥 문제에서 주어지는 대로 빠르게 풀었다.
import java.io.*;
import java.util.*;
public class Main {
public static int N, M;
public static int[][] map;
public static int[] road, visited;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
N = Integer.parseInt(br.readLine());
M = Integer.parseInt(br.readLine());
map = new int[N][N];
road = new int[M];
visited = new int[N];
for(int i = 0; i < N; i++){
st = new StringTokenizer(br.readLine());
for(int j = 0; j < N; j++){
map[i][j] = Integer.parseInt(st.nextToken());
}
}
st = new StringTokenizer(br.readLine());
for(int i = 0; i < M; i++){
road[i] = Integer.parseInt(st.nextToken()) - 1;
}
int start = road[0];
Queue<Integer> q = new LinkedList<>();
q.offer(start);
while(!q.isEmpty()){
int cur = q.poll();
if(visited[cur] == 1) continue;
visited[cur] = 1;
for(int i = 0; i < N; i++){
if(map[cur][i] == 1 && visited[i] == 0){
q.offer(i);
}
}
}
for(int i = 1; i < M; i++){
if(visited[road[i]] == 0) {
System.out.println("NO");
System.exit(0);
}
}
System.out.println("YES");
}
}
풀긴 풀었지만 입력의 수가 늘어나면 시간초과가 날꺼 같아서 유니온 파인드로도 풀어보았다.
import java.io.*;
import java.util.*;
public class Main {
static int N, M;
static int[] rank, parent;
static int find(int x){
if(parent[x] == x) return x;
return parent[x] = find(parent[x]);
}
static void union(int a, int b){
a = find(a);
b = find(b);
if(a == b) return;
if(rank[a] > rank[b]) parent[b] = a;
else if(rank[a] < rank[b]) parent[a] = b;
else{
parent[a] = b;
rank[b]++;
}
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
N = Integer.parseInt(br.readLine());
M = Integer.parseInt(br.readLine());
parent = new int[N];
rank = new int[N];
for(int i = 0; i < N; i++) parent[i] = i;
for(int i = 0; i < N; i++){
st = new StringTokenizer(br.readLine());
for(int j = 0; j < N; j++){
int v = Integer.parseInt(st.nextToken());
if(v == 1) union(i, j);
}
}
st = new StringTokenizer(br.readLine());
int first = Integer.parseInt(st.nextToken()) - 1;
int root = find(first);
for(int i = 1; i < M; i++){
int city = Integer.parseInt(st.nextToken()) - 1;
if(find(city) != root){
System.out.println("NO");
return;
}
}
System.out.println("YES");
}
}

시간 차이가 그렇게 많이 나진 않는다.
'코딩테스트 > JAVA' 카테고리의 다른 글
| [백준 JAVA] 2075번: N번째 큰 수 (1) | 2026.01.01 |
|---|---|
| [백준 JAVA] 1987번: 알파벳 (0) | 2025.12.31 |
| [백준 JAVA] 1943번: 동전 분배 (0) | 2025.12.25 |
| [백준 JAVA] 1927번: 최소 힙 (0) | 2025.12.25 |
| [백준 JAVA] 1863번: 스카이라인 쉬운거 (1) | 2025.12.24 |