2359 - Find Closest Node to Given Two Nodes
정보
- 문제 보기: 2359 - Find Closest Node to Given Two Nodes
- 소요 시간: 37분 56초
- 풀이 언어:
java - 체감 난이도: 3️⃣
- 리뷰 횟수: ✅
풀이 키워드
스포주의
bfs
풀이 코드
정보
- 메모리: 56300 KB
- 시간: 16 ms
class Solution {
public int closestMeetingNode(int[] edges, int node1, int node2) {
final int n = edges.length;
int[] dist1 = new int[n];
int[] dist2 = new int[n];
Arrays.fill(dist1, -1);
Arrays.fill(dist2, -1);
Deque<int[]> q = new ArrayDeque<>();
q.add(new int[]{node1, 0});
dist1[node1] = 0;
while (!q.isEmpty()) {
int[] e = q.poll();
int s = e[0];
int v = e[1];
int t = edges[s];
if (t == -1) break; // no outgoing node
if (dist1[t] != -1) break; // already visited
dist1[t] = v + 1;
q.add(new int[]{t, v+1});
}
q = new ArrayDeque<>();
q.add(new int[]{node2, 0});
dist2[node2] = 0;
while (!q.isEmpty()) {
int[] e = q.poll();
int s = e[0];
int v = e[1];
int t = edges[s];
if (t == -1) break; // no outgoing node
if (dist2[t] != -1) break; // already visited
dist2[t] = v + 1;
q.add(new int[]{t, v+1});
}
int ans = -1;
int mn = Integer.MAX_VALUE;
for (int i = 0; i < n; ++i) {
if (dist1[i] == -1 || dist2[i] == -1) continue;
int res = Math.max(dist1[i], dist2[i]);
if (res < mn) {
mn = res;
ans = i;
}
}
return ans;
}
}
풀이 해설
node1, node2에 대해 각각 bfs를 돌려서 거리를 구하고
문제에서 주어진 조건에 따라 가장 적합한 거리를 리턴해야 하는 문제이다.
bfs 2번 + 최적해 스캔 로직을 합해서 의 시간복잡도를 가지게 된다.
사이클이 있을 수 있다고 명시되어있기 때문에 visited 처리가 필수이다. (명시 안해도 처리해야되긴 함)