본문 바로가기
개인 공부/알고리즘 트레이닝

[python] BOJ 1260 DFS와 BFS

by 아메리카노와떡볶이 2022. 4. 12.
728x90
BOJ 1260 DFS와 BFS

https://man-25-1.tistory.com/214

 

이코테 - DFS & BFS

이코테 - DFS & BFS 본 게시물은 이것이 코딩테스트다(저자 나동빈님)의 책을 구매하고 공부하는 과정에서 남기는 정보공유의 목적보다 개인적인 기록에 가까운 포스팅입니다. 작년 여름에 구매한

man-25-1.tistory.com

dfs,bfs 개념설명은 위 글을 참조하면 됩니다.

문제

 

DFS와 BFS 공부한 내용을 적용해볼 겸 가장 기초 문제를 풀어보았다.

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

 

1260번: DFS와 BFS

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사

www.acmicpc.net

문제는 그냥 DFS와 BFS를 구현하는 간단한 문제이다. 따로 설명이 필요한 부분은 없을거같다.

예제 입출력 부분을 확인하면, 각 정점의 인접정점 정보를 한줄씩 입력받는다. 이 부분을 그래프 정보로 어떻게 표현할지만 고민하면 될 것 같다.

 

풀이코드

기초적인 내용이라 따로 설명할 부분은 없을거같다. 다만 정점의 인접정보를 아래 코드처럼 1차원 리스트를 선언해서 해줄수도 있지만 좀 보기좋게 2차원리스트로 하는게 더 깔끔해보이긴한다.

from collections import deque

def dfs(graph,v,visited):
    visited[v]= True
    print(v, end=' ')

    for i in graph[v]:
        if not visited[i]:
            dfs(graph,i,visited)


def bfs(graph,start,visited):
    queue = deque([start])

    visited[start] = True
    while queue:
        v = queue.popleft()
        print(v,end =' ')
        for i in graph[v]:
            if not visited[i]:
                queue.append(i)
                visited[i] = True

N,M,V = map(int,input().split())
graph = []
for i in range(N+1):
    graph.append([])

for i in range(M):
     v,w= map(int,input().split())
     graph[v].append(w)
     graph[w].append(v)
     graph[v].sort()
     graph[w].sort()

visited = [False] * (N+1)

dfs(graph,V,visited)
visited = [False] * (N+1)
print()
bfs(graph,V,visited)

 

 

2차원리스트로 수정한 코드

from collections import deque
def dfs(matrix,v,visited):
    visited[v]= True
    print(v, end=' ')

    for i in range(1,N+1):
        if not visited[i] and matrix[v][i] == 1:
            dfs(matrix,i,visited)

def bfs(matrix,start,visited):
    queue = deque([start])

    visited[start] = True
    while queue:
        v = queue.popleft()
        print(v,end =' ')
        for i in range(1,N+1):
            if not visited[i] and matrix[v][i] == 1:
                queue.append(i)
                visited[i] = True


N,M,V = map(int,input().split())
#0행과 0열은 쓰지않는다
matrix = [[0 for _ in range(N+1)] for _ in range(N+1)]

for i in range(M):
     v,w= map(int,input().split())
     matrix[v][w] = 1
     matrix[w][v] = 1
     
visited = [False] * (N+1)

dfs(matrix,V,visited)
visited = [False] * (N+1)
print()
bfs(matrix,V,visited)

728x90

댓글