[백준-실버2]DFS와 BFS - python

iamjinseo·2022년 10월 6일
0

문제풀이-Python

목록 보기
110/134
post-custom-banner

https://www.acmicpc.net/problem/1260

문제

그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다.

입력

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.

출력

첫째 줄에 DFS를 수행한 결과를, 그 다음 줄에는 BFS를 수행한 결과를 출력한다. V부터 방문된 점을 순서대로 출력하면 된다.

풀이

# DFS와 BFS 실버2

from collections import deque, defaultdict
import sys

class Graph : 
    def __init__(self, V):
        self.V = V
        self.adj = defaultdict(list) #인접리스트
    
    def addEdge(self, v, w):
        self.adj[v].append(w)
        self.adj[w].append(v)
    
    def DFS(self, s):
        visited = [False]*(self.V+1) #처음에는 모두 미방문
        stack = [s] #현재 노드 추가
        res = []

        while stack :
            s = stack.pop() #스택 최상단 팝

            if visited[s] == 0: #미방문 노드일시 방문처리
                visited[s] = True
                res.append(s)

            # 현재 노드 s의 모든 인접 노드 검사
            # 방문하지 않았다면 스택에 push 
            for v in sorted(self.adj[s], reverse=True): #작은 노드부터 검사
                if not visited[v]:
                    stack.append(v)
        return res

    def BFS(self, s):
        visited = [False]*(self.V+1) #처음에는 모두 미방문

        queue = deque()
        queue.append(s)
        visited[s] = True

        res = []

        while queue:
            s = queue.popleft()
            res.append(s)

            # deque한 vertex의 모든 인접 노드들을 얻는다. 
            # 만약 탐색한 적이 없는 노드라면 방문처리하고 enqueue한다.
            for v in sorted(self.adj[s]):
                if not visited[v]:
                    queue.append(v)
                    visited[v] = True
        return res
    
    def printGraph(self):
        for k, v in self.adj.items():
            print(k, "=>", v)


N, M, V = map(int, sys.stdin.readline().split()) 
g = Graph(N) #N개의 vertex로 이루어진 그래프

for i in range(M): #간선생성
    v1, v2 = map(int, sys.stdin.readline().split())
    g.addEdge(v1, v2)

# g.printGraph()
print(*g.DFS(V))
print(*g.BFS(V))

https://velog.io/@iamjinseo/DFSBFS 참고

별 거 없고 DFS와 BFS개념 숙지해서 구현하면 된다.

근데 나는 이 별 거 없는 문제에 몇시간이나 썼다

결과

코드 길이가 좀 길게 나왔는데 printGraph()부분 없애면 좀 줄어들 것 같다

그리고 시간이 다른 파이썬 유저들 결과보다 훨씬 빨라서 긍정적으로 생각함 (다른 유저들은 400ms시간대)

후기

그래프 탐색..너무 어렵다
어려워서 개념공부까지 했는데도 이런 기본 문제에서 어려움을 느꼈다...
더 열심히 해야지

profile
일단 뭐라도 해보는 중
post-custom-banner

0개의 댓글