https://www.acmicpc.net/problem/15971
N개의 방이 존재하고, 통로는 N-1개 존재한다.
두 로봇 간에 통신이 필요하고, 통신을 위해서는 로봇 사이에 1개의 통로만 존재해야 한다.
통신을 하기 위해 두 로봇이 이동해야 하는 최단 거리는?
입력
첫 번째 줄 : n, a, b
n : 방 개수
a : 1번 로봇 위치
b : 2번 로봇 위치
나머지 줄 : s, e, d
s : 시작점
e : 끝점
d : 길이
출력
로봇이 서로 통신하기 위해 현재 위치에서 이동해야하는 거리합의 최솟값
bfs나 dfs와 같은 그래프 탐색 기법을 사용하면 풀 수 있는 문제입니다.
저는 dfs를 통해 a부터 끝까지 탐사하면서 지나간 통로의 길이를 배열에 저장해두고, b에 도달한다면 (지금까지 지나간 모든 통로의 합 - 가장 긴 통로)를 정답으로 출력하려고 했습니다.
import sys
sys.setrecursionlimit(10**6)
def dfs(idx, arr):
global b, ans
v[idx] = True
if idx == b:
arr.sort()
ans = sum(arr) - arr[-1]
return
for nxt, dis in graph[idx]:
if v[nxt] == True:
continue
arr.append(dis)
dfs(nxt, arr)
arr.pop()
n, a, b = list(map(int, input().split()))
v = [False] * (n + 1)
ans = 0
graph = [[] for _ in range(n + 1)]
for _ in range(n - 1):
s, e, d = list(map(int, input().split()))
graph[s].append([e, d])
graph[e].append([s, d])
if a == b:
print(0)
exit()
dfs(a, [])
print(ans)
1)
풀이 시 40%에서 틀리는 부분이 있었다.
만약 두 로봇이 같은 위치에 있는 경우에는 어떻게 해야 하는가에 대한 예외처리를 하지 않아 발생한 문제였다.
2)
로봇의 위치가 하나의 통로만 가지고 있는 경우에도 동일하게 모든 통로를 더해서 가장 긴 통로를 빼는 방식으로 해결이 되는데 괜히 예외처리하다가 틀렸다.
정신 차리고 문제 풀어야겠다.
해당 코드는 에디터가 코드 연습을 위해 직접 작성하였습니다.
혹시 오류가 있거나 더 좋은 코드 방향성을 아시는 분은 댓글로 남겨주시면 감사하겠습니다!
python source : https://github.com/ssh5212/conding-test-practice
java source : https://github.com/ssh5212/coding-test-java
[BOJ / 백준] 16562 친구비 (G4 / DFS) - Python (0) | 2024.06.30 |
---|---|
[Softeer/소프티어] 나무 섭지 (Lv3 / BFS) - Python (0) | 2024.06.29 |
[BOJ / 백준] 2644 촌수계산 (S2 / DFS) - Python (0) | 2024.06.27 |
[BOJ / 백준] 2606 바이러스 (S3 / DFS) - Python (0) | 2024.06.26 |
[BOJ / 백준] 1407 2로 몇 번 나누어질까 (G4^ / 수학) - Python (0) | 2024.06.24 |