백준

백준 14940 - 쉬운 최단거리

황태건 2023. 7. 13. 20:33

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

 

14940번: 쉬운 최단거리

지도의 크기 n과 m이 주어진다. n은 세로의 크기, m은 가로의 크기다.(2 ≤ n ≤ 1000, 2 ≤ m ≤ 1000) 다음 n개의 줄에 m개의 숫자가 주어진다. 0은 갈 수 없는 땅이고 1은 갈 수 있는 땅, 2는 목표지점이

www.acmicpc.net

BFS가 어떻게 진행되는 지 이해해야 풀 수 있는 문제

 

목표지점까지의 최단 거리를 구하기 위해, 각 지점에서 매번 일반적인 BFS를 수행하게 되면 BFS를 N^2번 수행해야 하므로 시간이 너무 오래 소요된다. 역으로 BFS를 목표지점에서 시작하면 한 번의 BFS로 모든 지점까지의 거리를 계산할 수 있다.

 

여기까지는 처음 문제를 보자마자 감이 왔는데, 거리 계산을 구현하는 데 애를 먹었다. 고생 끝에 내가 찾은 해답은 다음과 같다. (별거 없긴 함)

 

동적계획법의 아이디어를 활용한다. 그래프 탐색은 항상 인접한 지점끼리 이뤄지므로, 시작 지점에서 현재 지점까지의 거리를 k라고 하면, 현재 지점에서 BFS를 통해 발견한 새 지점까지의 거리는 반드시 k+1이다.

 

따라서 일반적인 BFS 코드에서 visited 배열 값 계산만 다음과 같이 구현하면 문제를 해결할 수 있다.

visited[next_row][next_col] = visited[cur_pos.row][cur_pos.col] + 1;

이 방법은 다른 그래프 탐색 문제에서도 자주 사용될 거 같아 익혀두면 좋을 듯 싶다.

 

배운 내용

2차원 vector 초기화

vector 생성자 ( vector (배열 크기, 초기값) )를 이용한다.

ex) vector arr(row, vector (col, 0)

'백준' 카테고리의 다른 글

백준 7662 - 이중 우선순위 큐  (0) 2023.07.14
백준 11723 - 집합 (얌체 풀이)  (1) 2023.07.14
백준 18870 - 좌표 압축  (0) 2023.07.11
백준 7576 - 토마토  (0) 2023.07.06
백준 11726 - 2xn 타일링  (0) 2023.07.05