본문 바로가기
2222
Algorithm/DFS.BFS

백준 - 1260 DFS와 BFS (파이썬)

by PARK TAE JOON 2021. 6. 30.

첫 시도 : 上

문제를 파악하고 2차원 리스트형태로 만드는 것부터 막혔었다.

해답을 보고 했지만 이해하기가 어려웠다.

 

두번째 시도 : 中

해답을 보면 이제 어떤 식으로 짜여졌는지 이해가 간다.

 

 

DFS, BFS를 이용하는 문제


 

핵심

1. 입력값으로 노드의 간선을 입력하는데 2차원 배열형태로 갈 수 있는 곳을 1로 표시해서 만든다.

2. 방문한 노드는 다시 방문하지 않도록 visited를 선언한다.

3. 1번 노드부터 시작하기 때문에 리스트들을 만들 때 제일앞은 건너뛴다고 가정하고 노드의 개수 +1 로 리스트를 만든다.

 

연습을 위해 DFS와 BFS를 나눠서 코드를 써보자.

먼저 DFS.

n , m, s = map(int, input().split())

visited = [False] * (n+1)
graph = [[0]*(n+1) for _ in range(n+1)]

for i in range(m):
    x, y = map(int, input().split())
    graph[x][y] = 1
    graph[y][x] = 1

def dfs(s):
    print(s, end=' ')
    visited[s] = True
    for i in range(1, n+1):
        if visited[i] == False and graph[s][i]:
            dfs(i)


dfs(s)

여러번 연습해 본 결과 생각하면서 풀기에 성공했다.

dfs 문 내에서를 보자면 스타트노드를 파라미터로 받아서 visited 리스트에 True로 방문했다. 로 표시하고 

노드1번부터 방문했는지를 확인해서 방문을 안했고 2차원 리스트상에서 간선이 연결되어 있는 곳이라면

dfs(i)를 실행해서 깊숙히 나아간다.

 

 

다음 BFS

def bfs(s):
    queue = [s]
    while queue:
        v = queue[0]
        print(v)
        del queue[0]

        for i in range(1, n+1):
            if visited[i] == False and graph[s][i]:
                queue.append(i)
                visited[i] = True


n, m, s = map(int, input().split())

visited = [False] * (n+1)
graph = [[0]*(n+1) for _ in range(n+1)]

for i in range(m):
    x, y = map(int, input().split())
    graph[x][y] = 1
    graph[y][x] = 1



bfs(s)
    

bfs는 큐 자료구조처럼 사용해서 먼저들어간 것이 먼저 나오도록(FIFO) 설계하는데 여기서는 하나씩 프린트로 출력해주기 위해서

일반적으로 그냥 queue라는 리스트를 선언하고 시작 노드를 넣고

 

while문을 이용해서 queue가 있을 때 동안은 계속 반복하게 만들고

queue안에 있는 것을 빼내거나(pop, popleft)

아니면 할당해서 특정 변수에 값을 넣고 프린트하고 삭제하고 ( 할당 후 del)

1번 노드부터 n번 노드까지 방문하기 위해서 for(1, n+1)을 하고

만약 아직 방문하지 않았고 2차원 리스트에서 방문 가능한 곳임을 확인했으면

1번부터 순차적으로 if문을 거쳐 해당 조건을 만족하는 것만 queue에 append한다.

다음 방문했다는 의미로 visited[i] = True를 한다.

'Algorithm > DFS.BFS' 카테고리의 다른 글

이코테-음료수 얼려먹기 (파이썬)  (0) 2021.06.29

댓글