따뜻했던 10월이 지나고 엄청 추운 한 주였다. 갑자기 추워진 탓에 얇게 입고 외출을 해서 고생도 했다. 요즘은 번아웃 방지를 위해서 일부러라도 밖에 나가 공부하는 중이다. 밖으로 나도니 의욕이 생겨서 요즘은 순공 시간을 많이 늘릴 수 있었다. 이력서 제작용 토이 프로젝트에 드디어 조금씩 진전이 보이기 시작한다. 아침, 저녁에는 겨울 같고, 낮에는 덥고,,, 어느 장단에 맞춰야 할지 모르겠는 11월 둘째 주를 되돌아본다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
new Main().run();
}
private void run() {
try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
Solution s = new Solution();
System.out.println(s.solution(readInput(br)));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private double[][] readInput(BufferedReader br) throws IOException {
int len = Integer.parseInt(br.readLine());
double[][] result = new double[len][2];
for (int i = 0; i < len; i++) {
result[i] = Arrays.stream(br.readLine().split(" ")).mapToDouble(Double::parseDouble).toArray();
}
return result;
}
}
class Solution {
public double solution(double[][] coordinates) {
List<double[]> stars = new ArrayList<>();
int len = coordinates.length;
for (int i = 0; i < len; i++) {
for (int j = 0; j < len; j++) {
if(i == j) continue;
stars.add(new double[]{i + 1, j + 1, getDistance(coordinates[i], coordinates[j])});
}
}
stars.sort(Comparator.comparing(a -> a[2]));
int[] groups = IntStream.range(0, len + 1).toArray();
double result = 0;
for (double[] star : stars) {
int from = (int) star[0];
int to = (int) star[1];
if (isConnected(groups, from, to)) {
continue;
}
connect(groups, from, to);
result += star[2];
}
return result;
}
private double getDistance(double[] star1, double[] star2) {
double width = star2[1] - star1[1];
double height = star2[0] - star1[0];
return Math.sqrt(Math.pow(width, 2) + Math.pow(height, 2));
}
private boolean isConnected(int[] groups, int star1, int star2) {
return getGroup(groups, star1) == getGroup(groups, star2);
}
private int getGroup(int[] groups, int target) {
if(groups[target] != target) return groups[target] = getGroup(groups, groups[target]);
return groups[target];
}
private void connect(int[] groups, int star1, int star2) {
int g1 = getGroup(groups, star1);
int g2 = getGroup(groups, star2);
if (g1 != g2) {
groups[Math.max(g1, g2)] = Math.min(g1, g2);
}
}
}