본문 바로가기
Develop/백준 (python)

[백준] 11403번: 경로찾기 (python)

by Tarra 2022. 4. 13.

11403번: 경로찾기


문제 )

가중치 없는 방향 그래프 G가 주어졌을 때, 모든 정점 (i, j)에 대해서, i에서 j로 가는 경로가 있는지 없는지 구하는 프로그램을 작성하시오.

 

입력 :

첫째 줄에 정점의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄부터 N개 줄에는 그래프의 인접 행렬이 주어진다. i번째 줄의 j번째 숫자가 1인 경우에는 i에서 j로 가는 간선이 존재한다는 뜻이고, 0인 경우는 없다는 뜻이다. i번째 줄의 i번째 숫자는 항상 0이다.

 

 

출력 :

총 N개의 줄에 걸쳐서 문제의 정답을 인접행렬 형식으로 출력한다. 정점 i에서 j로 가는 경로가 있으면 i번째 줄의 j번째 숫자를 1로, 없으면 0으로 출력해야 한다.

 

 

 

 

풀이)

요즘 문제를 풀 때 가장 문제 되는게 2가지가 있다.

 

1. 자신감의 하락.

분명히 배웠던 것이고 충분히 풀 수 있는 문제임에도 불구하고 문제를 풀어나갈 때 망설여 하는 것 같다.

 

2. 비교와 조바심.

자꾸 문제를 착착 풀어나가는 남들과 나를 비교해서 내 페이스를 잃어버리는 것 같다.

 

이 문제도 그렇게 좀 해맸던 것 같다.

 

문제는 풀어야겠고, 나를 남들과 자꾸 비교하다보니 내 실력을 못 믿고 자꾸 어렵게 풀어서 복잡해지는 기분이다.

 

이 문제를 풀 때, 처음에는 어렵게 생각해서 방문도 2차원에 dfs의 인자도 2개를 넘게 했고, 

 

심지어 풀지도 못했다.

 

한 3~4일 후에 좀 놓고, 종이에다가 플랜을 짠 뒤, 차근 차근 풀어보니 엄청 간단한 문제였다.

 

나는 내 페이스가 있으니 남들과 비교하지 말고 꾸준하게 해야겠다.

 

각설은 여기까지 하고, 나는 문제를 이렇게 풀었다.

 


 

간선이 인접행렬의 형태로 넘어온다.

 

문제는 내가 지금 보고 있는 노드가 어떠한 노드들과 연결되어있는지가 인접행렬의 형태로 나타내어야 하기 때문에,

 

각 노드에 대해서 dfs를 진행해주었고, 출발한 노드를 인자로 계속 가지고 다니면서 

 

만나는 노드에 대해, 새로운 인접행렬을 만들어주었다.

 

( 사이클이 있을 경우에는 자기 자신을 만나게 되는 경우도 생긴다.)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def dfs(a, ver):
    for i in range(n):
        if g[a][i] == 1 and visited[i] == 0:
            visited[i] = 1
            route[ver][i] = 1
            dfs(i, ver)
 
= int(input())
= [list(map(int, input().split())) for i in range(n)]
route = [[0* n for i in range(n)]
 
# 각 노드에 대해서 dfs
for i in range(n):
    visited = [0* n
    dfs(i, i)
 
for i in route:
    print(*i)
 
cs
 

출처 : https://www.acmicpc.net/problem/11403

 

11403번: 경로 찾기

가중치 없는 방향 그래프 G가 주어졌을 때, 모든 정점 (i, j)에 대해서, i에서 j로 가는 경로가 있는지 없는지 구하는 프로그램을 작성하시오.

www.acmicpc.net