[백준] 13023번 - ABCDE

chanyeong kim·2022년 9월 9일
0

백준

목록 보기
157/200
post-thumbnail

📩 출처

문제

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을 출력한다.

👉 생각

  • 간단하게 DFS로 깊이 우선 탐색을 했을 때 깊이가 4이상이 있는지 없는지 판별하는 문제였다.
  • DFS로 접근하는게 익숙하지 않아서 고민을 좀 하긴 했지만, 결과적으로 재귀를 통해 다음 깊이로 들어갈 수 있다면 depth에 1을 더해주고 dfs를 돌렸다.
  • 주의할 점은 depth에 1을 더해주고 다시 돌아 와서는 방문처리를 취소해주어야 한다!!
import sys

def dfs(start, depth):
    global check
    visited[start] = 1

    if depth == 4:
        check = True
        return

    for num in adj[start]:
        if not visited[num]:
            dfs(num, depth + 1)
            visited[num] = 0

n, m = map(int, input().split())
adj = [[] for _ in range(n)]
visited = [0 for _ in range(n)]
check = False
for _ in range(m):
    first, second = map(int, sys.stdin.readline().split())
    adj[first].append(second)
    adj[second].append(first)

for i in range(n):
    dfs(i, 0)
    visited[i] = 0
    if check:
        break
print(1 if check else 0)

0개의 댓글