문제설명
더보기
문제
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
문제풀이
DFS를 이용하여 해결을 했다.
이 문제는 값을 넣었을 때 DFS의 깊이가 5가 나오면 1을 출력을 해주면 된다.
package doit_java;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class doit_25_친구관계파악하기 {
static ArrayList<Integer>[] A;
static boolean visited[];
static boolean arrive;
public static void main(String[] args)throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
A = new ArrayList[N];
visited = new boolean[N];
for(int i=0; i<N; i++){A[i]= new ArrayList<>();}
for(int i=0; i<M; i++){
st=new StringTokenizer(br.readLine());
int S = Integer.parseInt(st.nextToken());
int E = Integer.parseInt(st.nextToken());
A[S].add(E);
A[E].add(S);
}
for(int i=0; i<M; i++){
DFS(i,1);
if(arrive) break;
}
if(arrive) System.out.println("1");
else{
System.out.println("0");
}
}
static void DFS(int num, int depth){
if(depth==5 || arrive){
arrive=true;
return;
}
visited[num]=true;
for (int i : A[num]) {
if(!visited[i]){
DFS(i,depth+1);
}
}
visited[num]=false;
}
}
제일 핵심인 DFS 해설
static void DFS(int num, int depth){
if(depth==5 || arrive){
arrive=true;
return;
}
visited[num]=true;
for (int i : A[num]) {
if(!visited[i]){
DFS(i,depth+1);
}
}
visited[num]=false;
}
깊이가 5또는 arrive가 true면 return;
아니면 방문한 노드를 true바꾸고 for문을 통해서 DFS를 재귀적으로 호출
'Etc. > Coding Test' 카테고리의 다른 글
[백준] 1934번 최소 공배수 구하기 (0) | 2022.06.28 |
---|---|
[백준] 1541번 잃어버린 괄호 (0) | 2022.06.26 |
[백준] 별 찍기 정리 (2) | 2022.06.16 |
[백준] 2023번 신기한 소수 찾기 (2) | 2022.06.15 |
[백준] 11399번 ATM 인출 시간 계산하기 (0) | 2022.05.27 |