본문 바로가기
Algorithm

백준 13023번 <ABCDE>

by seungh2 2022. 8. 27.

백준 알고리즘 13023번

https://www.acmicpc.net/problem/13023

 

13023번: ABCDE

문제의 조건에 맞는 A, B, C, D, E가 존재하면 1을 없으면 0을 출력한다.

www.acmicpc.net


13023번

N명의 사람이 있고 M개의 친구관계가 주어질 때 다음과 같은 친구관계가 존재하는지 구하여라.

  • A는 B와 친구
  • B는 C와 친구
  • C는 D와 친구
  • D는 E와 친구

 

입력으로 첫 줄에 N과 M이 주어진다. 그 다음 M개의 줄에는 정수 a와 b가 주어지는데 이는 a와 b가 친구라는 뜻이다.

 

출력으로 위와 같은 친구관계가 존재한다면 1을, 존재하지 않는다면 0을 출력한다.


문제 해결

어려웠다,,, 쉬워보였는데 왜 이렇게 어려운지ㅠ

 

처음에는 MST를 이용해서 풀어야 하나 했는데 아닌 거 같아서 BFS를 이용해서 풀어보려고 했는데 잘 안됬다.

친구 관계를 인접 관계로 하고 DFS를 돌려서 depth가 5가 되면 된다.

 

DFS를 돌릴 때는 방문한 후에 인접 관계를 기준으로 다시 DFS를 호출하고 depth가 5가 안 됬으면 방문을 취소한다.

(다른 DFS에서 방문할 수 있도록)


코드

package boj13023;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
	static int N;
	static ArrayList<Integer>[] list;
	static boolean[] visit;

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		N = sc.nextInt();
		int M = sc.nextInt();

		list = new ArrayList[N];
		for (int i = 0; i < N; i++) {
			list[i] = new ArrayList<Integer>();
		}

		for (int i = 0; i < M; i++) {
			int a = sc.nextInt();
			int b = sc.nextInt();
			list[a].add(b);
			list[b].add(a);
		} // end input

		int ans = 0;
		for (int i = 0; i < N; i++) {
			visit = new boolean[N];
			if (dfs(i, 1)) {
				ans = 1;
				break;
			}
		}
		System.out.println(ans);
	}

	static boolean dfs(int n, int depth) {
		visit[n] = true;
		if (depth == 5) {
//			System.out.println(Arrays.toString(visit));
			return true;
		}
		boolean chk = false;
		int size = list[n].size();
		for (int i = 0; i < size; i++) {
			if (visit[list[n].get(i)])
				continue;
			chk = dfs(list[n].get(i), depth + 1);
			if(chk) return true;
		}
		visit[n] = false;
		return false;
	}

}

결과


visit 체크를 재귀 호출하기 전에 하면 안된다!!ㅎ

 

728x90

'Algorithm' 카테고리의 다른 글

백준 16918번 <봄버맨>  (0) 2022.08.27
백준 17144번 <미세먼지 안녕!>  (0) 2022.08.27
백준 16235번 <나무 재테크>  (0) 2022.08.27
백준 17142번 <연구소 3>  (0) 2022.08.27
백준 16918번 <봄버맨>  (0) 2022.08.27

댓글