alsgud3229   5년 전

  1. 우선 인접행렬의 BFS 시간복잡도가 O(|V|^2) 라고 하는데 그럼 이 문제의 경우 (1500*1500)^2의 시간복잡도를 갖는건가요? 
  2. 저의 로직에서 시간을 어떻게 줄여야할까요?

로직: BFS를 통해 백조가 만날 수 있는지를 판단하여 bool로 반환한다 -> 반환이 false라면 얼음을 녹인다

위 과정을 반복하여 백조가 만나게 되는 최소 날짜를 출력했습니다. 

djm03178   5년 전

  1. O(|V|^2)이라는 것은 모든 정점에서 모든 정점으로 가는 간선이 있을 수 있을 때 쓰는 말이고, 이 문제에서는 인접 행렬을 만드신 적이 없을 뿐더러 dx와 dy를 통해 각 칸마다 최대 4개의 간선만을 사용하기 때문에 O(4|V|) 정도만을 탐색하면 됩니다.
  2. 하지만 이 코드에서는 BFS를 한 번만 돌리는 것이 아니라 얼음이 다 녹을 때까지 돌리고, 이 시간은 최대 O(|V|) 회 반복될 수 있습니다. 그래서 약 세제곱이 도는 것이고, 이 방법으로는 시간 초과를 피할 수 없습니다.

매번 얼음을 녹이고 다시 BFS를 하지 않고, 과정을 진행하면서 얼음을 녹이는 방법을 생각해 보세요. 즉, 전체에서 BFS가 딱 한 번만 돌아야 합니다. 또는 union find 등을 사용할 수도 있습니다.

alsgud3229   5년 전

과정을 진행하면서 얼음을 녹이는 방법.

에서 깨달음을 얻었습니다 감사합니다 한번 해볼게요!

댓글을 작성하려면 로그인해야 합니다.