[CodingTest] 백준 1260번 DFS와 BFS

정재원·2021년 7월 31일

문제

내 풀이

init_ls = input().split()
vertex_num = int(init_ls[0])
edge_num = int(init_ls[1])
start_vertex = int(init_ls[2])

adjacency_ls_dfs = [[] for _ in range(vertex_num+1)]
adjacency_ls_bfs = [[] for _ in range(vertex_num+1)]

for _ in range(edge_num):
    edge = input().split()
    edge[0] = int(edge[0])
    edge[1] = int(edge[1])
    
    adjacency_ls_dfs[edge[0]].append(edge[1])
    adjacency_ls_dfs[edge[1]].append(edge[0])
    
    adjacency_ls_bfs[edge[0]].append(edge[1])
    adjacency_ls_bfs[edge[1]].append(edge[0])


for i in range(len(adjacency_ls_bfs)):
    adjacency_ls_dfs[i] = sorted(adjacency_ls_dfs[i], reverse=True)
    adjacency_ls_bfs[i] = sorted(adjacency_ls_bfs[i])

stack = [start_vertex]
visited_vertex_dfs = []

while stack:
    current = stack.pop()
    
    for neighbor in adjacency_ls_dfs[current]:
        if (not neighbor in visited_vertex_dfs) :
            stack.append(neighbor)
    if current not in visited_vertex_dfs:
        visited_vertex_dfs.append(current)
    

visited_vertex_bfs = []    
    
from collections import deque

queue = deque([start_vertex])
visited_vertex_bfs.append(start_vertex)

while queue:
    current = queue.popleft()
    for neighbor in adjacency_ls_bfs[current]:
        if (not neighbor in visited_vertex_bfs) :
            queue.append(neighbor)
            if neighbor not in visited_vertex_bfs:
                visited_vertex_bfs.append(neighbor)


for i in visited_vertex_dfs:
    if i == visited_vertex_dfs[-1]:
      print(i)
      break
    print(i, end = " ")
    
for i in visited_vertex_bfs:
    print(i, end = " ")

bfs와 dfs를 이용해 풀어본 두번째 문제이다. graph에 cycle이 있는 경우 어떻게 해결해야하는지 점차 알아가게 되는 것 같다. 지금 사용하고 있는 dfs코드에서는 adjacency_ls가 vertex별로 성분이 내림차순으로 정렬되어 있어야 하고 bfs코드는 오름차순으로 정렬되어 있어야 하는데, 하나의 adjacency_ls를 이용하도록 개선이 필요하다.

profile
생각합니다.

1개의 댓글

comment-user-thumbnail
2021년 7월 31일

다른 사람은 어떻게 풀었나 보던 중 위에서 말한 하나의 adjacency_list를 사용하면서 더 간결한 코드를 발견해 추후 학습을 위해 남겨 놓는다. bfs와 dfs 알고리즘이 동작하는 방식에 익숙해지면 나도 아래 처럼 간결하게 작성할 수 있을 거라 기대한다.

N,M,V = map(int, input().split())

d = dict()
for i in range(1,N+1):
d[i] = []
for i in range(1,M+1):
a,b = map(int, input().split())
d[a].append(b)
d[b].append(a)

def dfs(d, start):
stack = list()
reach = list()

stack.append(start)
while stack:
    node = stack.pop()
    if node not in reach:
        reach.append(node)
        stack.extend(sorted(d[node], reverse = True))
return reach

def bfs(d, start):
stack = list()
reach = list()

stack.append(start)
while stack:
    node = stack.pop(0)
    if node not in reach:
        reach.append(node)
        stack.extend(sorted(d[node]))
return reach

print(dfs(d,V))
print(
bfs(d,V))

답글 달기