Leetcode Java Find the City With the Smallest Number of Neighbors at a Threshold Distance
업데이트:
문제
코드
class Solution {
public int findTheCity(int n, int[][] edges, int distanceThreshold) {
int[][] distance = new int[n][n];
int result = 0;
int min = n;
for (int[] row : distance) {
Arrays.fill(row, 10001);
}
for (int[] edge : edges) {
distance[edge[0]][edge[1]] = distance[edge[1]][edge[0]] = edge[2];
}
for (int i = 0; i < n; i++) {
distance[i][i] = 0;
}
for (int k = 0; k < n; k++) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
distance[i][j] = Math.min(distance[i][j], distance[i][k] + distance[k][j]);
}
}
}
for (int i = 0; i < n; i++) {
int count = 0;
for (int j = 0; j < n; j++) {
if (distance[i][j] <= distanceThreshold) {
count++;
}
}
if (count <= min) {
result = i;
min = count;
}
}
return result;
}
}
결과
설명
- n개의 도시간 연결 정보가 있는 edges를 이용하여, 도시 간 이동이 distanceThreshold 이내로 이동하여 도달할 수 있는 가장 적은 도시 중 큰 숫자의 도시를 반환하는 문제이다.
- edges[i] = [fromi, toi, weighti] 로, from번째 도시에서 to번째 도시까지 거리가 weight임 의미한다.
- 문제 풀이에 필요한 변수를 정의한다.
- distance는 Floyd Warshall 알고리즘을 이용하여 거리를 계산하기 위한 변수로, $n \times n$ 크기의 2차원 정수 배열로 초기화 후 아래를 수행한다.
- distance의 모든 위치에 최댓값인 10000 보다 1 큰 10001을 넣어준다.
- edges의 각 값들을 이용하여 distance[edge[0]][edge[1]], distance[edge[1]][edge[0]] 두 위치에 거리인 edge[2] 값을 넣어준다.
- 자기 자신으로 가는 경우인 출발지와 도착지가 동일한 경우, 값을 0으로 초기화해준다.
- 노드의 경유를 고려하여 i번째 도시에서 j번째 도시로 가는 distance[i][j]와 k를 경유하는 경우인 $distance[i][k] + distance[k][j]$ 중 최단 거리를 넣어준다.
- result는 결과를 저장하기 위한 변수로, 0으로 초기화한다.
- 최솟값을 저장하기 위한 min을 가능한 최대 도시의 값인 n으로 초기화한다.
- distance는 Floyd Warshall 알고리즘을 이용하여 거리를 계산하기 위한 변수로, $n \times n$ 크기의 2차원 정수 배열로 초기화 후 아래를 수행한다.
- 0부터 n 미만까지 i를 증가시키면서 아래를 반복한다.
- count는 각 도시로 이동 가능한 도시의 갯수를 저장할 변수로, 0으로 초기화한다.
- 0부터 n 미만까지 j를 증가시키면서 distance[i][j]의 값이 distanceThreshold 이하인 도시의 갯수를 계산한다.
- count가 min 이하이면 result에 i를, min에 count를 넣어 준다.
- 반복이 완료되면 이동 가능한 도시가 적으면서 도시의 숫자가 가장 큰 result를 주어진 문제의 결과로 반환한다.
해설
- 여느 문제와 같이 도시의 숫자가 작은 값부터 이동 가능한 도시의 갯수가 동일한 경우를 포함하는 이유는, 문제의 조건인 도시의 숫자가 큰 경우만 남기기 위함이다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기