[문제]
BOJ 알고리즘 캠프에는 총 N명이 참가하고 있다. 사람들은 0번부터 N-1번으로 번호가 매겨져 있고, 일부 사람들은 친구이다.
오늘은 다음과 같은 친구 관계를 가진 사람 A, B, C, D, E가 존재하는지 구해보려고 한다.
- A는 B와 친구다.
- B는 C와 친구다.
- C는 D와 친구다.
- D는 E와 친구다.
위와 같은 친구 관계가 존재하는지 안하는지 구하는 프로그램을 작성하시오.
[나의 풀이]
import sys
N, M = map(int, input().split())
arr = [[] for _ in range(N)]
visited = [False] * N
# 그래프를 인접 리스트 방식으로 담는다.
for _ in range(M):
a, b = map(int, sys.stdin.readline().rstrip().split())
arr[a].append(b)
arr[b].append(a)
# dfs 깊이가 4이면 return 1
def dfs(n, depth):
visited[n] = True
if depth >= 4:
print(1)
exit(0)
for k in arr[n]:
if not visited[k]:
dfs(k, depth+1)
visited[k] = False
for i in range(N):
if not visited[i]:
dfs(i, 0)
visited[i] = False
print(0)
- 인접리스트 방식으로 담는 법을 처음 알았다.
- dfs함수에 숫자를 넣을 n과 함께 depth가 어느정도인지 알 수 있도록 두가지 파라미터를 넘겨준다.
- dfs를 호출한 다음 다시 visited를 false로 해야하는지 처음에 이해가 안갔는데, 하나의 주기가 끝나고 다음 주기를 탐색할 때 다시 visited가 false로 초기화 돼있어야 갯수를 잘 셀수 있었다.
[다른 사람의 풀이]
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
adj_lst = [[] for i in range(n)]
for i in range(m):
a, b = map(int, input().split())
adj_lst[a].append(b)
adj_lst[b].append(a)
visited = [False for i in range(n)]
def dfs(v, depth):
global ans
visited[v] = True
if depth >= 4:
ans = True
return
for nxt in adj_lst[v]:
if not visited[nxt]:
dfs(nxt, depth + 1)
visited[nxt] = False
ans = False
for i in range(n):
dfs(i, 0)
visited[i] = False
if ans:
break
print(1 if ans else 0)
import sys
input = sys.stdin.readline
N, M = map(int, input().split())
rel = [list(map(int, input().split())) for _ in range(M)]
sort_rel = {}
for i in range(0, N):
sort_rel[i] = []
global friend
zero = True
def isFriend(k):
friend.append(k)
print('friend : ', friend)
if len(friend) == 5:
return True
# for v in dic[k]:
# if v not in friend:
# return isFriend(v, dic)
# else:
# pass
for v in sort_rel[k]:
if v not in friend:
ans = isFriend(v)
friend.remove(v)
if ans == 1:
return ans
for x, y in rel:
sort_rel[x].append(y)
sort_rel[y].append(x)
for key in sort_rel.keys():
friend = []
if isFriend(key):
print(1)
zero = False
break
if zero:
print(0)
'알고리즘 > 알고리즘 문제' 카테고리의 다른 글
[python] 백준 > 부르트포스 > 덩치 (0) | 2021.01.18 |
---|---|
[python] 백준 > 괄호 (0) | 2021.01.15 |
[python] 백준 > dfs > 단지번호 붙히기 (0) | 2021.01.14 |
[python] 프로그래머스 > 시저암호 (0) | 2021.01.13 |
[python] 프로그래머스 > 3진법 뒤집기 (0) | 2021.01.12 |