developer-ellen
인간 디버거의 로그 찍기
developer-ellen
전체 방문자
오늘
어제
  • 분류 전체보기 (217)
    • 회고록 (0)
    • 취뽀 및 커리어 여정의 Stack (2)
      • SSAFY 7기 (2)
    • 프로그래밍공부 (24)
      • c++ (0)
      • JAVA (3)
      • Spring (5)
      • design pattern (3)
      • BackDB (1)
      • Servlet&JSP (3)
      • Vue (4)
      • JPA (4)
      • Infra (1)
      • Linux (0)
    • AI (3)
      • papers (3)
      • trend (0)
    • 프로젝트진행 (0)
      • 데이터베이스 (0)
      • 서버개발 (0)
      • 인공지능 (0)
      • 하루정리 (0)
    • 포트폴리오 (0)
    • 알고리즘 (158)
      • 알고리즘문풀 (155)
      • 알고리즘공부 (3)
    • 통계공부 (15)
      • 시계열분석 (15)
      • 회귀분석 (0)
    • CS (14)
      • 컴퓨터네트워크 (4)
      • 운영체제 (8)
      • 데이터베이스 (2)
    • 주저리주저리 (0)
      • 필사 (0)
    • 취업관련정보 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 데이터분석
  • 통계학
  • 시계열분석
  • c++ 빌더 패턴
  • 삼성코테자바꿀팁
  • 카카오코테java풀이
  • 통계분석
  • 삼성코테파이썬
  • 백준파이썬풀이
  • 카카오코테
  • 삼성코테파이썬준비
  • 코테파이썬
  • 삼성코테구현문제추천
  • SW역량테스트파이썬풀이
  • MA모형
  • 삼성코테파이썬풀이
  • AR모형
  • 삼성코테구현풀이
  • 삼성코테준비
  • 삼성코테자바준비
  • SW역량테스트파이썬
  • 시계열
  • 삼성코테자바풀이
  • ARIMA모형
  • Arima
  • 삼성코테기출
  • c++디자인패턴
  • 삼성코테기출자바풀이
  • 운영체제인터럽트
  • BOJ파이썬풀이

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
developer-ellen

인간 디버거의 로그 찍기

알고리즘/알고리즘문풀

BOJ - 우주신과의 교감 1774번 (JAVA)

2022. 9. 10. 20:22

❓ 문제 - 백준 우주신과의 교감 1774번 - JAVA 풀이법

 

출처 

(https://www.acmicpc.net/problem/1774)

 

1774번: 우주신과의 교감

(1,1) (3,1) (2,3) (4,3) 이렇게 우주신들과 황선자씨의 좌표가 주어졌고 1번하고 4번이 연결되어 있다. 그렇다면 1번하고 2번을 잇는 통로를 만들고 3번하고 4번을 잇는 통로를 만들면 신들과 선자씨끼

www.acmicpc.net

 

 

📝 문제해결법

1. 문제

  • n개의 우주신의 정보(x, y)가 주어질 때 이미 연결된 신들을 제외한 다른 우주신을 최소 비용으로 해서 모두 다 연결할 때의 통로 길이 합을 구하여라.

 

2. 해결 방법

  • MST(최소 스패닝 트리)로 우선 각 우주신들의 모두 연결된 경우를 union_find 해준다.
  • 그리고 나머지 각 우주신들은 다 연결되어 있으므로 거리를 pq(우선순위큐)에 넣어 최소 거리부터 union_find를 해줘서 모든 우주신들을 최소비용으로 연결할 수 있도록 구현해준다.

 

3. 느낀점

  • 계속 9%에서 틀렸다고 해서 진짜 int가 아닌 long을 쓸 부분이 있는지, 아니면 코드 자체를 잘못 구현했는지를 계속 살폈는데 알고보니 통로의 길이는 소숫점 둘째자리로 처리되어 해야 해서 Math.pow(~, 2) 이런 식으로 거듭제곱을 처리해야했음..

 

 

 

💻 소스코드 (JAVA)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Main_1774 {
    public static int[] parent;
    public static Node[] node;

    public static class Node {
        int x;
        int y;
        public Node(int x, int y){
            this.x = x;
            this.y = y;
        }
    }

    public static class Edge implements Comparable<Edge> {
        int a;
        int b;
        double dist;
        public Edge(int a, int b, double dist){
            this.a = a;
            this.b = b;
            this.dist = dist;
        }

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

    public static int n, m;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());

        node = new Node[n+1];
        parent = new int[n+1];
        for(int i=0;i<n;i++){
            st = new StringTokenizer(br.readLine(), " ");
            int x = Integer.parseInt(st.nextToken());
            int y = Integer.parseInt(st.nextToken());
            node[i+1] = new Node(x, y);
            parent[i+1] = i+1;
        }

        for(int i=0;i<m;i++){
            st = new StringTokenizer(br.readLine()," ");
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            union_parent(a, b);
        }

        PriorityQueue<Edge> pq = new PriorityQueue<>();
        for(int i=1;i<=n;i++){
            for(int j=i+1;j<=n;j++){
                double cost = Math.sqrt(Math.pow(node[i].x - node[j].x, 2) + Math.pow(node[i].y - node[j].y, 2));

                pq.add(new Edge(i, j, cost));
            }
        }

        double cost = 0;
        while (!pq.isEmpty()){
            Edge edge = pq.poll();
            if(find_parent(edge.a) != find_parent(edge.b)){
                union_parent(edge.a, edge.b);
                cost += edge.dist;
            }
        }


        System.out.printf("%.2f", cost);


    }

    public static int find_parent(int x) {
        if(parent[x] == x) return x;
        return parent[x] = find_parent(parent[x]);
    }

    public static void union_parent(int a, int b){
        a = find_parent(a);
        b = find_parent(b);
        if(a < b){
            parent[b] = a;
        } else {
            parent[a] = b;
        }
    }
}

 

'알고리즘 > 알고리즘문풀' 카테고리의 다른 글

BOJ - 게임 개발 1516번 (JAVA)  (0) 2022.09.22
BOJ - 네트워크 복구 2211번 (JAVA)  (0) 2022.09.18
BOJ - 다리 만들기 2146번 (JAVA)  (0) 2022.09.09
BOJ - 벽 부수고 이동하기4 16946번 (JAVA)  (0) 2022.09.04
BOJ - 정육면체 9029번 (JAVA)  (0) 2022.08.28
    '알고리즘/알고리즘문풀' 카테고리의 다른 글
    • BOJ - 게임 개발 1516번 (JAVA)
    • BOJ - 네트워크 복구 2211번 (JAVA)
    • BOJ - 다리 만들기 2146번 (JAVA)
    • BOJ - 벽 부수고 이동하기4 16946번 (JAVA)
    developer-ellen
    developer-ellen

    티스토리툴바