ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준]2887: 행성 터널 - JAVA
    문제풀이/백준 2021. 2. 16. 18:57

    [백준]2887: 행성 터널

    www.acmicpc.net/problem/2887

     

    2887번: 행성 터널

    첫째 줄에 행성의 개수 N이 주어진다. (1 ≤ N ≤ 100,000) 다음 N개 줄에는 각 행성의 x, y, z좌표가 주어진다. 좌표는 -109보다 크거나 같고, 109보다 작거나 같은 정수이다. 한 위치에 행성이 두 개 이

    www.acmicpc.net

     

    풀이

    MST유형의 문제로, 모든 간선의 정보를 만들어서 그 중에 작은 간선을 선택하면서 최소 간선을 찾을 수 있게 kruskal 알고리즘을 사용하여 구현하였다.

     

    행성의 정보를 입력받을때 이차원배열을 사용하여 2중 반복문으로 모든 노드의 거리의 최솟값을 구해 q에 넣어주었더니 메모리 초과가 났다.

     

    행성의 정보를 저장하는 class를 따로 구현해주었고 x, y, z거리를 오름차순 정렬을 해서 작은 값 부터 q에 들어가도록 구현해 주었다. 

     

    코드

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    import java.util.*;
     
    public class Main {    
     
        static int n;
        static PriorityQueue<Edge> q;
        static int[] parent;
        static int result;
        static Planet[] planet;
        
        public static void main(String[] args) {
            Scanner scan = new Scanner(System.in);
            
            n = scan.nextInt();
     
            planet = new Planet[n];
            for(int i = 0; i < n; i++) {
                int x = scan.nextInt();
                int y = scan.nextInt();
                int z = scan.nextInt();
                planet[i] = new Planet(i, x, y, z);
            }
            q = new PriorityQueue<>();
            
            //x좌표 순서대로 오름차순 정렬 후 작은 값부터 q에 edge정보 저장.
            Arrays.sort(planet, (o1, o2) -> o1.x - o2.x);
            for(int i = 0; i < n - 1; i++) {
                q.offer(new Edge(planet[i].num, planet[i + 1].num, Math.abs(planet[i].x - planet[i + 1].x)));
            }
            //y좌표 순서대로 오름차순 정렬 후 작은 값부터 q에 edge정보 저장.
            Arrays.sort(planet, (o1, o2) -> o1.y - o2.y);
            for(int i = 0; i < n - 1; i++) {
                q.offer(new Edge(planet[i].num, planet[i + 1].num, Math.abs(planet[i].y - planet[i + 1].y)));
            }
            //z좌표 순서대로 오름차순 정렬 후 작은 값부터 q에 edge정보 저장.
            Arrays.sort(planet, (o1, o2) -> o1.z - o2.z);
            for(int i = 0; i < n - 1; i++) {
                q.offer(new Edge(planet[i].num, planet[i + 1].num, Math.abs(planet[i].z - planet[i + 1].z)));
            }
            
            parent = new int[n];
            kruskal();
            System.out.println(result);
        }
        
        public static void kruskal() {
            for(int i = 0; i < n; i++) {
                parent[i] = i;
            }
            
            while(!q.isEmpty()) {
                Edge edge = q.poll();
                int p1 = find(edge.s);
                int p2 = find(edge.e);
                
                if(p1 != p2) {
                    union(p1, p2);
                    result += edge.cost;
                }
            }
        }
        
        public static void union(int a, int b) {
            parent[a] = b;
        }
        
        public static int find(int a) {
            if(parent[a] == a) return a;
            else return parent[a] = find(parent[a]);
        }
        
        public static class Planet {
            int num;
            int x;
            int y;
            int z;
            
            public Planet(int num, int x, int y, int z) {
                this.num = num;
                this.x = x;
                this.y = y;
                this.z = z;
            }
        }
        
        public static class Edge implements Comparable<Edge>{
            int s;
            int e;
            int cost;
            
            public Edge(int s, int e, int cost) {
                this.s = s;
                this.e = e;
                this.cost = cost;
            }
     
            @Override
            public int compareTo(Edge e) {
                return this.cost - e.cost;
            }
        }
    }
    cs

    '문제풀이 > 백준' 카테고리의 다른 글

    [백준]1238: 파티 - JAVA  (0) 2021.02.17
    [백준]11404: 플로이드 - JAVA  (0) 2021.02.17
    [백준]1922: 네트워크 연결  (0) 2021.02.16
    [백준]1766: 문제집 - JAVA  (0) 2021.02.15
    [백준]10026: 적록색약 - JAVA  (0) 2021.02.14

    댓글

Designed by Tistory.