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

xogh7532님의 프로필 이미지
xogh7532

작성한 질문수

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

5. 톰과 제리 문제해설(BFS)

호텔 연결 질문드립니다.

작성

·

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);
}

여기서 ab의 값에 -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번 이후에 발생하는 문제가 해결될 수 있을 것입니다. 만약 여전히 문제가 해결되지 않는다면, 다른 부분에서의 오류 가능성도 고려하여 코드 전체를 다시 검토해 보시길 권장드립니다.

xogh7532님의 프로필 이미지
xogh7532

작성한 질문수

질문하기