작성
·
75
0
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
아래와 같이 작성하니까 예제 4번부터 틀렸다고 나옵니다.
어디가 잘못 된건지 궁금합니다.
import java.io.*;
import java.util.*;
class Node implements Comparable<Node>{
int v1;
int v2;
double c;
Node(int v1, int v2, double c) {
this.v1=v1;
this.v2=v2;
this.c=c;
}
@Override
public int compareTo(Node o) { //double형은 이렇게 한다.
return Double.compare(this.c, o.c);
}
}
public class Main {
public static int n,m;
public static int[] unf;
public static ArrayList<Node> graph = new ArrayList<>();
public static ArrayList<Integer> x = new ArrayList<>();
public static ArrayList<Integer> y = new ArrayList<>();
public static int find(int v) {
if(v==unf[v]) return v;
else return unf[v] = find(unf[v]);
}
public static void union(int a, int b) {
int fa = find(a);
int fb = find(b);
if(fa!=fb) unf[fa] = fb;
}
public static void main(String[] argvs) {
Scanner sc = new Scanner(System.in);
n=sc.nextInt();
m=sc.nextInt();
unf = new int[n];
for(int i=0; i<n; i++) unf[i] = i;
for(int i=0; i<n; i++) {
int a=sc.nextInt()-1;
int b=sc.nextInt()-1;
x.add(a);
y.add(b);
}
for(int i=0; i<n; i++) { //점과 점 사이의 거리를 구하는 구문
for(int j=i+1; j<n; j++) {
double dis = Math.sqrt((x.get(j)-x.get(i)) *(x.get(j)-x.get(i)) + (y.get(j)-y.get(i)) * (y.get(j)-y.get(i)));
graph.add(new Node(i,j,dis));
}
}
for(int i=0; i<m; i++) { //이미 연결되어 있는 점들은 union해준다
int a=sc.nextInt();
int b=sc.nextInt();
union(a-1,b-1);
}
Collections.sort(graph);
double answer=0;
for(int i=0; i<graph.size(); i++) { //크루스칼
int fa = find(graph.get(i).v1);
int fb = find(graph.get(i).v2);
double cost = graph.get(i).c;
if(fa!=fb) {
//union(fa, fb);
unf[fa] = fb;
answer+=cost;
}
}
System.out.format("%.2f", answer); //소수점 출력은 System.out.format으로
}
}
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
xogh7532님의 코드를 검토해 본 결과, 잠재적 오류의 원인을 발견했습니다. 코드는 크루스칼 알고리즘을 구현하는 데에 있어서 기본적인 구조는 올바르나, union
함수 호출 시 주석 처리된 union(fa, fb);
대신 직접 unf[fa] = fb;
로 작성하셨습니다. 이 방식도 기능적으로는 union
함수의 역할을 수행합니다. 하지만 더 효율적이고 가독성이 좋은 코드 관리를 위해서는 union(fa, fb);
호출 방식을 사용하는 것이 좋습니다.
그리고 더 중요한 것은, 예제 4번에서 틀린 결과가 나온 주요 원인으로 생각할 수 있는 부분이 있습니다. 입력 받는 부분에서 각 점의 좌표를 입력 받는 로직이 잘못되었습니다. 아래 부분을 살펴보세요.
for(int i=0; i<n; i++) {
int a=sc.nextInt()-1;
int b=sc.nextInt()-1;
x.add(a);
y.add(b);
}
여기서 a
와 b
의 값에 -1
을 한 이유를 잘 모르겠습니다. -1
을 하는 것은 특정 조건(예를 들어, 1부터 시작하는 인덱스를 0부터 시작하는 배열 인덱스에 맞추기 위함)에서 필요한데, 여기서는 점의 좌표를 입력 받는 부분이므로 -1
을 할 필요가 없습니다. 이 부분을 수정해야 합니다. 수정된 코드는 아래와 같습니다.
for(int i=0; i<n; i++) {
int a=sc.nextInt();
int b=sc.nextInt();
x.add(a);
y.add(b);
}
이 수정을 통해 예제 4번 이후에 발생하는 문제가 해결될 수 있을 것입니다. 만약 여전히 문제가 해결되지 않는다면, 다른 부분에서의 오류 가능성도 고려하여 코드 전체를 다시 검토해 보시길 권장드립니다.