백준 13023 - ABCDE
Updated:
Java
13023 번 - ABCDE
문제
접근 방법
문제를 이해하기 어려웠다.
문제의 조건을 읽으면 다음과 같은데,
A는 B와 친구다.
B는 C와 친구다.
C는 D와 친구다.
D는 E와 친구다.
이말은 즉슨, A -> B -> C -> D -> E 까지 차례로 5명이 관계를 가지는 경우가 있는지를 확인하면 된다.
즉, 그래프의 관점으로 보았을 때, 첫번재 노드부터 깊이가 5까지 내려갈 수 있는지 판단하면 된다.
이것은 DFS를 통해 해결하였다.
주의해야할 점은 사람의 수 N이 (5 ≤ N ≤ 2000)으로 꽤 크다.
DFS를 통해 타고 내려가면 2000^3까지 나올 수 있으므로 시간초과가 유발된다.
친구 관계의 수 M은 최대 2000까지 이므로, 친구의 관계를 나타낼 때 2차원 int 배열이 아닌,
ArrayList를 사용한다.
이를 사용하면, 현재 자신과 이어진 친구를 탐색할 때 최대 n명을 탐색하는 것이 아닌 것보다 훨씬 적은 수의 사람만 탐색하면 된다.
for(int nextN : friend.get(curN)) { // curN과 친구 관계를 가진 사람만 가져옴
...
}
for(int nextN = 0; nextN < N; nextN++) { // 이의 경우 N이 2000이면 시간초과가 발생한다.
...
}
코드
import java.util.*;
import java.io.*;
public class Main {
static int n, m, result;
static ArrayList<ArrayList<Integer>> friend;
static boolean[] vis;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stk = new StringTokenizer(br.readLine());
n = stoi(stk.nextToken()); // 사람의 수
m = stoi(stk.nextToken()); // 관계의 수
int a,b;
friend = new ArrayList<>();
for(int i = 0; i < n; i++) {
friend.add(new ArrayList<>());
}
for(int i = 0; i < m; i++) {
stk = new StringTokenizer(br.readLine());
a = stoi(stk.nextToken());
b = stoi(stk.nextToken());
friend.get(a).add(b);
friend.get(b).add(a);
}
for(int i = 0; i < n; i++) {
vis = new boolean[n];
if(DFS(i,0)) {
System.out.println(1);
return;
}
}
System.out.println(0);
br.close();
}
private static boolean DFS(int curN, int depth) {
if(depth == 4) {
return true;
}
vis[curN] = true;
for(int nextN : friend.get(curN)) {
if(!vis[nextN]) {
if(DFS(nextN, depth + 1))
return true;
vis[nextN] = false;
}
}
return false;
}
static int stoi(String str) {
return Integer.parseInt(str);
}
}