경로 찾기
1 초 | 256 MB | 48730 | 30122 | 22291 | 61.702% |
문제
가중치 없는 방향 그래프 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으로 출력해야 한다.
예제 입력 1 복사
3
0 1 0
0 0 1
1 0 0
예제 출력 1 복사
1 1 1
1 1 1
1 1 1
예제 입력 2 복사
7
0 0 0 1 0 0 0
0 0 0 0 0 0 1
0 0 0 0 0 0 0
0 0 0 0 1 1 0
1 0 0 0 0 0 0
0 0 0 0 0 0 1
0 0 1 0 0 0 0
예제 출력 2 복사
1 0 1 1 1 1 1
0 0 1 0 0 0 1
0 0 0 0 0 0 0
1 0 1 1 1 1 1
1 0 1 1 1 1 1
0 0 1 0 0 0 1
0 0 1 0 0 0 0
일단 문제를 잘 이해하자.
i번째 줄의 j번째 숫자가 1인 경우에는 i에서 j로 가는 간선이 존재한다는 뜻이고, 0인 경우는 없다는 뜻이다
이 말을 잘 생각해야한다.
일단 i에서 j로 가는 간선이 존재한다 -> 방향이 존재한다 라고 생각해야한다.
그렇게 한다면 첫번째 예제 입력은 다음과 같은 그래프를 가진다.
그리고 문제에서 경로가 있는지 없는지 물었다!
즉, 0에서 0으로 간다면, 자기자신이라고 방문했다 체크하면 안되고, 0 - 1 - 2 - 0 과 같이 오는 길이 있을때만 방문 가능하다고 체크해야한다.
두 번째 예제는 다음과 같은 모양일것이다.
이 문제는 여러 방법이 있지만 DFS로 풀었다.
#11403 경로찾기
def DFS(graph, v, visited):
visited[v] = 1
for i in graph[v]:
if not visited[i]:
DFS(graph, i, visited)
n = int(input())
li = []
for i in range(n):
li.append(list(map(int,input().split())))
#1이 있는 경로를 찾아야함.
graph = [[] for i in range(n)]
for i in range(n):
for j in range(len(li[i])):
if li[i][j] == 1:
graph[i].append(j)
for i in range(n):
visited = [0] * n
if len(graph[i]) >= 1:
for j in graph[i]:
DFS(graph, j,visited)
for k in visited:
print(k, end=' ')
else:
for j in range(n):
print(0,end=' ')
print('')
경로 탐색을 시작할 때, 그래프를 미리 제시해두고, DFS에 넣어서 풀었다.
두 번째 예제는 그래프가 다음과 같이 들어간다.
graph = [[3], [6], [], [4, 5], [0], [6], [2]]
그래프의 요소들을 살펴보면 2번째 요소는 길이가 0이고, 3번째 요소는 길이가 2이다.
따라서 길이가 0일때는 그 요소로 들어가는 경로가 없다는 뜻이기 때문에 정점의 갯수만큼 0을 출력했다.
그리고 3번째 요소는 4,5 두가지 경로가 존재하기 때문에 두가지 경로 모두 조사해줘야 하기 때문에
if len(graph[i]) >= 1:
for j in graph[i]:
DFS(graph, j,visited)
for k in visited:
print(k, end=' ')
처럼 for문을 활용해 모든 요소에 접근 할 수 있도록 해주었다.
문제 자체가 감이 안와 처음에 이해하기 어려웠던점이 있었다.
'Study > CodingTest' 카테고리의 다른 글
[백준/Python] (S1) 1389 - 케빈 베이컨의 6단계 법칙 (0) | 2024.04.22 |
---|---|
[이코테/Python] 최단경로 (0) | 2024.04.22 |
[백준/Python] (G4) 7662- 이중 우선순위 큐 (0) | 2024.04.03 |
[백준/Python] (S2) 1912- 연속합 (0) | 2024.04.01 |
[백준/Python] (S2) 2805 - 나무 자르기 (0) | 2024.03.04 |