알고리즘 공부
[백준 13023번] ABCDE - java
철매존
2024. 12. 29. 02:49
728x90
반응형
문제 설명
1. 사람 수 N, 관계 수 M 이 주어진다.
2. 그 다음부터 M 개로 관계들이 주어진다.
3. A - B - C - D - E 이렇게 친구인지 여부를 구하면 된다.
풀이 과정
1. DFS + 백트래킹
2. 각 친구 상태를 가지는 ArrayList 를 배열로 가지면 된다.
3. 현 사람을 기준으로 모든 관계 ArrayList 를 찾고 주르륵 찾으면 된다.
4. 그리고 이전에 확인한 사람인지 체크 여부를 확인해서 백트래킹 해주면 된다.
5. 이게 잘 동작하는 이유는 어차피 이전으로 돌아가지 않으니 depth 가 차면 알아서 ABCDE 열차가 완성되기 때문이다.
코드
/******************************************************************************
Online Java Compiler.
Code, Compile, Run and Debug java program online.
Write your code in this editor and press "Run" button to execute it.
*******************************************************************************/
import java.util.*;
public class Main
{
private static ArrayList<Integer>[] relationList;
private static boolean check[];
private static int ans = 0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int M = sc.nextInt();
// 최초 초기화 - relationList는 모든 인원들에 대해 이 사람의 친구를 저장한다.
relationList = new ArrayList[N];
check = new boolean[N];
for(int i=0; i<N; i++) relationList[i] = new ArrayList<>();
for(int i=0; i<M; i++) {
int a = sc.nextInt();
int b = sc.nextInt();
relationList[a].add(b); // 각 사람들의 친구 관계를 저장
relationList[b].add(a);
}
// 모든 사람들에 대해서 A-B-C-D-E 관계가 있는지를 체크한다.
for(int i=0; i<N; i++) {
DFS(0, i);
}
System.out.println(ans);
}
private static void DFS(int depth, int now) {
if (depth == 4) { // 4명까지 친구로 확인되면 정답
ans = 1;
return;
}
if (ans == 1) return;
// 백트레킹 지금 나의 탐색 여부 확인
check[now] = true;
ArrayList<Integer> friendList = relationList[now]; // 내 친구들 확인
// 그래서 그 친구들 모두에 대해 확인하면 된다.
for(int i=0; i<friendList.size(); i++) {
int friend = friendList.get(i);
if (!check[friend]) {
DFS(depth+1, friend); // 이게 되는 이유는 한번 이 사람에 대해 체크하게 되면 그 다음 친구에 대해 확인할 때 일자로 유지가 가능하다.
}
}
check[now] = false;
}
}
반응형