728x90
https://www.acmicpc.net/problem/13023
문제
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을 출력한다.
728x90
예제 입력 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
처음엔 N명의 친구가 모두 연결되어야 하는 줄 알았는데, 답이 달라 다시 읽어보니 연결된 친구 5명만 찾으면 되는 문제였다. 이걸 DFS라고 해야할진 모르겠지만... 한 명의 친구에서 시작해서 5명의 친구에 도착하게 되면 1을 출력하고 프로그램을 종료한다. 모든 경우를 다 찾아볼 때까지 프로그램이 종료되지 못했다면 0을 출력한다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
static int N;
static int M;
static ArrayList<ArrayList<Integer>> list;
static boolean[] visited;
static int result;
private static void dfs(int start, int count) {
if(count == 5) { // 5명의 친구를 찾았다면
System.out.println(1); // 1 출력하고
System.exit(0); // 시스템 종료
}
ArrayList<Integer> startList = list.get(start); // start의 친구 목록을 가져와서
for (int i = 0; i < startList.size(); i++) {
int friend = startList.get(i);
if(!visited[friend]) { // 아직 방문하지 않은 친구라면
visited[friend] = true; // 방문체크 해주고
dfs(friend, count + 1); // 다음 친구 찾으러
visited[friend] = false;
}
}
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
// 사람의 수 N, 친구 관계의 수 M 입력
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
// 관계를 담을 list
list = new ArrayList<>();
for (int i = 0; i < N; i++) list.add(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.get(a).add(b);
list.get(b).add(a);
}
visited = new boolean[N];
for (int i = 0; i < N; i++) {
dfs(i, 0);
}
System.out.println(0); // 아직 종료되지 않고 dfs가 끝났다면 해당되는 친구 관계가 없는 것
}
}
728x90
'Problem Solving > BOJ' 카테고리의 다른 글
[백준, BOJ 10813] 공 바꾸기 (java) (0) | 2023.02.26 |
---|---|
[백준, BOJ 2023] 신기한 소수 (java) (0) | 2023.02.26 |
[백준, BOJ 1759] 암호 만들기 (java) (0) | 2023.02.25 |
[백준, BOJ 10026] 적록색약 (java) (0) | 2023.02.25 |
[백준, BOJ 2606] 바이러스 (java) (0) | 2023.02.25 |