코테 연습
BFS/DFS
첫 번째
https://www.acmicpc.net/problem/13023
13023번: ABCDE
문제의 조건에 맞는 A, B, C, D, E가 존재하면 1을 없으면 0을 출력한다.
www.acmicpc.net
import sys
input = lambda: sys.stdin.readline().rstrip()
sys.setrecursionlimit(2001)
N, M = map(int, input().split())
relation = [[] for _ in range(N)]
for _ in range(M):
p_1, p_2 = map(int, input().split())
relation[p_1].append(p_2)
relation[p_2].append(p_1)
def dfs(i, cnt, visited):
if cnt == 4:
return True
visited.append(i)
for friend in relation[i]:
if friend not in visited:
if dfs(friend, cnt+1, visited):
return True
visited.pop()
return False
def solve():
for i in range(N):
visited = []
if dfs(i, 0, visited):
return 1
return 0
print(solve())
import sys
n,m = map(int,sys.stdin.readline().split())
adj = [[]for i in range(n)]
for i in range(m):
a, b = map(int,sys.stdin.readline().split())
adj[a].append(b)
adj[b].append(a)
visited = [0 for _ in range(n)]
flag = 0
def dfs(now,cnt):
global flag
visited[now] = 1
if cnt == 4:
flag = 1
return
for nxt in adj[now]:
if visited[nxt] != 1:
dfs(nxt,cnt+1)
visited[nxt] = 0
for i in range(n):
dfs(i,0)
visited[i] = 0
if flag == 1:
break
if flag == 1:
print(1)
else:
print(0)
문제를 풀면서 고민했던 부분은
dfs로 4층까지 친구관계를 구해야하는데
4층 깊이 탐색을 실패하고 dfs 스택에서 돌아올 때, visited가 원래대로 돌아와야한다는 점이었다.
이 부분을 어떻게 구현할까 고민하다가
시간 복잡도가 여유가 있다고 판단하고 visited를 리스트로 받아서 순차 탐색하는 것으로 정했다.
밑에 우수코드를 참고하면 dfs 이후에 visited를 바로 False하는 과정이 있는데
이는 조합과 순열을 재귀함수로 구현할 때(또는 brute-force) 사용했던 방법이라 눈에 익었다.
아쉽게도 이번에 생각하지 못했지만 다음에는 써먹자.
'알고리즘' 카테고리의 다른 글
11.28 알고리즘 문제풀이 (1) | 2023.11.28 |
---|---|
11.27 알고리즘 문제풀이 (0) | 2023.11.27 |
11.21 알고리즘 문제풀이 (2) | 2023.11.21 |
11.20 알고리즘 문제풀이 (1) | 2023.11.20 |
11.19 알고리즘 문제풀이 (0) | 2023.11.19 |