[문제해결 - 그래프] BOJ13023 / ABCDE / 골드5 (Python , 파이썬)

oldshoe·2026년 2월 26일

알고리즘 문제

목록 보기
53/59

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

예제 입력 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

문제 해결 과정

처음에는 문제를 잘 이해하지 못했다.
A - B - C - D - E 이렇게 친구가 되어야 된다는 소린데, 처음에는 BFS를 활용해서 해결하려했다.

그냥 BFS는 크나큰 문제가 있었다.
예를 들어
0 - 1 - 2 - 4 - 5

3
0에서 1과 3을 담고 visited[0]을 true로 만든 다음, 1과 3으로 넘어갔을 때 1은 2와 4 쪽으로 넘어갈 수 있지만 3은 끝이기 때문에 visited[1]을 True로 만들어버리면 돌아갈 방도가 없다. 백트래킹을 적용할 수가 없다.

따라서 재귀함수를 써야한다.
deque()를 쓰지 않고 재귀함수를 써서 넘어가게 되면 depth도 쉽게 쌓을 수 있다.

최종 코드

from collections import defaultdict

N, M = map(int, input().split())
dic = defaultdict(list)

for _ in range(M):
    a, b = map(int, input().split())
    dic[a].append(b)
    dic[b].append(a)

def dfs(cur, depth):
    if depth == 4:   
        print(1)
        exit()

    for nxt in dic[cur]:
        if visited[nxt]:
            continue
        visited[nxt] = True
        dfs(nxt, depth + 1)
        visited[nxt] = False

for i in range(N):
    visited = [False] * N
    visited[i] = True
    dfs(i, 0)

print(0)
profile
toomuxi : There are many things in the world that I want to do

0개의 댓글