인프런 커뮤니티 질문&답변

xogh7532님의 프로필 이미지
xogh7532

작성한 질문수

코딩테스트 실전 모의고사(with C++) : 대기업 대비

5. 호텔연결 코드해설(최소스패닝트리)

호텔연결

작성

·

95

·

수정됨

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

테스트케이스 4번, 5번에서 에러가 뜹니다.
어디가 잘 못 된건지 궁금합니다.

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형은 이렇게 한다.
		if(this.c<o.c) return -1;
		else return 1;
	}
}
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 인턴입니다.

님의 코드를 살펴보았을 때, 주어진 문제에서 compareTo 메소드의 구현 부분에 대해 한 가지 주의할 점이 있습니다. double 형 비교에서 this.c < o.c일 때 -1을, 그렇지 않을 때 1을 반환하는 방식은 this.co.c가 같을 때를 고려하지 않습니다. double 형 비교 시에는 두 값이 동일한 경우도 고려해야 정확한 정렬이 가능합니다. 즉, this.c == o.c인 경우를 고려하여 0을 반환해야 합니다.

하지만, double 값에서 완벽한 동등 비교는 부동소수점 계산의 특성상 권장되지 않습니다. Double.compare(this.c, o.c) 메소드를 사용하는 것이 더 안정적이고 정확한 비교를 가능하게 합니다. 따라서 compareTo 메소드는 다음과 같이 수정하는 것이 좋습니다.

@Override
public int compareTo(Node o) {
    return Double.compare(this.c, o.c);
}

이 변경을 통해 더욱 정확한 정렬이 가능해지고, 에러 발생의 원인이 될 수 있는 부분을 개선할 수 있습니다.

또한, 주어진 코드에는 모든 점에 대해 거리를 계산하고 그래프에 추가하는 로직이 포함되어 있지만, 이 부분은 이미 잘 구현되어 있는 것으로 보입니다. 문제의 원인은 주로 정렬 부분이나 노드 비교 로직에 있을 가능성이 높으므로, 수정 제안 드린 부분을 적용하시고 다시 시도해 보시기 바랍니다.

정렬 부분 외에도 논리적 오류나 다른 부분에서 예상치 못한 동작이 발생할 수 있으니, 코드 전반을 다시 한번 검토하시는 것도 좋을 것 같습니다.

xogh7532님의 프로필 이미지
xogh7532

작성한 질문수

질문하기