[JAVA]SWEA - 2001 파리 퇴치 (D2)

2025. 2. 25. 17:13· [LG 유플러스] 유레카/코딩테스트
import java.io.*;
import java.util.*;

public class Solution {
    static int N;
    static double E;
    static long[][] islands;
    static int[] parent;
    static List<Edge> edges;

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int T = Integer.parseInt(br.readLine());

        for (int t = 1; t <= T; t++) {
            N = Integer.parseInt(br.readLine());
            islands = new long[N][2];
            edges = new ArrayList<>();

            StringTokenizer tk = new StringTokenizer(br.readLine());
            for (int i = 0; i < N; i++) {
                islands[i][0] = Long.parseLong(tk.nextToken());
            }

            tk = new StringTokenizer(br.readLine());
            for (int i = 0; i < N; i++) {
                islands[i][1] = Long.parseLong(tk.nextToken());
            }

            E = Double.parseDouble(br.readLine());

            for (int i = 0; i < N; i++) {
                for (int j = i + 1; j < N; j++) {
                    edges.add(new Edge(i, j, getCost(i, j)));
                }
            }

            double minCost = kruskalMST();
            sb.append("#").append(t).append(" ").append(Math.round(minCost)).append("\n");
        }
        System.out.print(sb);
    }

    static double kruskalMST() {
        Collections.sort(edges);
        parent = new int[N];
        for (int i = 0; i < N; i++) parent[i] = i;

        double totalCost = 0;
        int count = 0;

        for (Edge edge : edges) {
            if (union(edge.u, edge.v)) {
                totalCost += edge.cost;
                if (++count == N - 1) break;
            }
        }
        return totalCost;
    }

    static double getCost(int i, int j) {
        long dx = islands[i][0] - islands[j][0];
        long dy = islands[i][1] - islands[j][1];
        return E * (dx * dx + dy * dy);
    }

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

    static boolean union(int a, int b) {
        int rootA = find(a);
        int rootB = find(b);
        if (rootA == rootB) return false;
        parent[rootB] = rootA;
        return true;
    }

    static class Edge implements Comparable<Edge> {
        int u, v;
        double cost;

        Edge(int u, int v, double cost) {
            this.u = u;
            this.v = v;
            this.cost = cost;
        }

        @Override
        public int compareTo(Edge o) {
            return Double.compare(this.cost, o.cost);
        }
    }
}
  • islands[][] : 각 섬의 (X, Y) 좌표를 저장
  • edges : 모든 섬 간의 간선(거리 및 환경 부담금) 저장 리스트
  • 간선을 비용 기준 오름차순 정렬
  • 각 노드의 부모 노드를 자기 자신으로 설정
  • 가장 작은 비용의 간선부터 선택
  • 사이클을 방지하기 위해 유니온 파인드 사용
  • N-1개의 간선이 선택되면 종료
  • totalcost 출력

 

 

'[LG 유플러스] 유레카 > 코딩테스트' 카테고리의 다른 글

[JAVA]백준 - 2252번 줄 세우기(골드3)  (0) 2025.02.25
[JS]프로그래머스 - 구명보트 (Lv.2)  (0) 2025.02.25
[JS]프로그래머스 - 피로도 (Lv.2)  (0) 2025.02.25
[JS]프로그래머스 - 프로세스 (Lv.2)  (0) 2025.02.24
[JS]프로그래머스 - 기능개발 (Lv.2)  (0) 2025.02.24
'[LG 유플러스] 유레카/코딩테스트' 카테고리의 다른 글
  • [JAVA]백준 - 2252번 줄 세우기(골드3)
  • [JS]프로그래머스 - 구명보트 (Lv.2)
  • [JS]프로그래머스 - 피로도 (Lv.2)
  • [JS]프로그래머스 - 프로세스 (Lv.2)
leeemingyu
leeemingyu
leeemingyu
ye
leeemingyu

블로그 메뉴

  • GitHub
  • Instagram
    전체
    오늘
    어제
    • 전체보기 (68)
      • GDSC (4)
        • 실시간 채팅 구현 (4)
      • [LG 유플러스] 유레카 (63)
        • Today I Learned (37)
        • 코딩테스트 (22)
        • 프로젝트 (4)

    공지사항

    인기 글

    최근 댓글

    최근 글

    hELLO · Designed By 정상우.v4.2.2
    leeemingyu
    [JAVA]SWEA - 2001 파리 퇴치 (D2)
    상단으로

    티스토리툴바

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.