반응형
문제
BOJ 알고리즘 캠프에는 총 N명이 참가하고 있다. 사람들은 0번부터 N-1번으로 번호가 매겨져 있고, 일부 사람들은 친구이다.
오늘은 다음과 같은 친구 관계를 가진 사람 A, B, C, D, E가 존재하는지 구해보려고 한다.
- A는 B와 친구다.
- B는 C와 친구다.
- C는 D와 친구다.
- D는 E와 친구다.
위와 같은 친구 관계가 존재하는지 안하는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 사람의 수 N (5 ≤ N ≤ 2000)과 친구 관계의 수 M (1 ≤ M ≤ 2000)이 주어진다.
둘째 줄부터 M개의 줄에는 정수 a와 b가 주어지며, a와 b가 친구라는 뜻이다. (0 ≤ a, b ≤ N-1, a ≠ b) 같은 친구 관계가 두 번 이상 주어지는 경우는 없다.
출력
문제의 조건에 맞는 A, B, C, D, E가 존재하면 1을 없으면 0을 출력한다.
예제 입력 1
5 4
0 1
1 2
2 3
3 4
예제 출력 1
1
예제 입력 2
5 5
0 1
1 2
2 3
3 0
1 4
예제 출력 2
1
예제 입력 3
6 5
0 1
0 2
0 3
0 4
0 5
예제 출력 3
0
예제 입력 4
8 8
1 7
3 7
4 7
3 4
4 6
3 5
0 4
2 7
예제 출력 4
1
소스코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.StringTokenizer;
public class Main {
private static BufferedReader br;
private static StringTokenizer st;
private static int N, M;
private static int []cnt;
private static boolean []visited;
private static boolean isValid;
private static List<Integer> []list;
public static void main(String[] args) throws IOException {
br=new BufferedReader(new InputStreamReader(System.in));
st=new StringTokenizer(br.readLine());
N=Integer.parseInt(st.nextToken());
M=Integer.parseInt(st.nextToken());
list=new ArrayList[N];
for(int i=0;i<N;i++) list[i]=new ArrayList<>();
for(int i=0;i<M;i++) {
st=new StringTokenizer(br.readLine());
int a=Integer.parseInt(st.nextToken());
int b=Integer.parseInt(st.nextToken());
list[a].add(b);
list[b].add(a);
}
cnt=new int[N];
isValid=false;
for(int i=0;i<N;i++) { // 0부터 N-1까지 각 점에서 시작하였을 때 최대 길이 탐색
visited=new boolean[N];
visited[i]=true;
dfs(i, i, 0);
if(isValid) break; // 가능한 경우 발견
}
if(isValid) System.out.println(1);
else System.out.println(0);
}
private static void dfs(int start, int x, int cnt) {
if(isValid) return;
if(cnt>=4) {
isValid=true;
return;
}
for(int i:list[x]) { // 백트래킹 형태로 구현
if(!visited[i]) {
visited[i]=true;
dfs(start, i, cnt+1);
visited[i]=false;
}
}
}
}
하나의 점에 연결된 친구가 여러명일 수 있는데, 각 경우에 대해 최대 친구 관계의 길이를 구하려면 백트래킹을 사용해주어야 합니다.
반응형
'코딩테스트 > 그래프 탐색' 카테고리의 다른 글
[Java] 백준 1939번 : 중량제한 (0) | 2022.05.12 |
---|---|
[Java] 백준 1043번 : 거짓말 (0) | 2022.05.11 |
[Java] 백준 12851번 : 숨바꼭질 2 (0) | 2022.05.11 |
[Java] 백준 2660번 : 회장뽑기 (0) | 2022.05.11 |
[Java] 백준 2617번 : 구슬 찾기 (0) | 2022.05.11 |