ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준]1939: 중량제한 - JAVA
    문제풀이/백준 2021. 2. 14. 15:56

    [백준]1939: 중량제한 - JAVA

    www.acmicpc.net/problem/1939

     

    1939번: 중량제한

    첫째 줄에 N, M(1≤M≤100,000)이 주어진다. 다음 M개의 줄에는 다리에 대한 정보를 나타내는 세 정수 A, B(1≤A, B≤N), C(1≤C≤1,000,000,000)가 주어진다. 이는 A번 섬과 B번 섬 사이에 중량제한이 C인 다리

    www.acmicpc.net

     

    풀이

    이 문제는 이분탐색 문제이며 이전에 풀었던 프로그래머스의 징검다리 건너기 문제와 비슷했다. 

     

    처음에는 인접행렬을 사용해서 풀었더니 메모리 초과가 났다. 그래서 다시 인접리스트로 바꾸어 풀어주었다. 이런 문제는 항상 인접행렬로 풀다보니 인접리스트르 바꾸는데 시간이 오래 걸렸다. 인접행렬은 N*N의 메모리 공간을 사용하므로 N에 큰 수가 들어오는 경우가 있다면 메모리 초과가 발생 할 것이다. 그러므로 이제는 인접 리스트로 풀도록 해야겠다.

     

    BFS를 사용해 시작 노드부터 도착 노드까지의 경로 중에 최소값을 찾아 그 값이 현재 중량과 비교해 건널 수 있는지 확인해 주었다.

     

    코드

    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
    import java.util.*;
     
    public class Main {    
        
        static int n, s, e;
        static ArrayList<Node> list[];
        static boolean[] visited;
        
        public static void main(String[] args) {
            Scanner scan = new Scanner(System.in);
            
            n = scan.nextInt();
            int m = scan.nextInt();
            
            list = new ArrayList[n + 1];
            for(int i = 0; i < n + 1; i++) {
                list[i] = new ArrayList<>();
            }
            
            int max = 0;
            int min = Integer.MAX_VALUE;
            for(int i = 0; i < m; i++) {
                int x = scan.nextInt();
                int y = scan.nextInt();
                int cost = scan.nextInt();    
                max = Math.max(cost, max);
                min = Math.min(cost, min);
                list[x].add(new Node(y, cost));
                list[y].add(new Node(x, cost));
            }
            
            s = scan.nextInt();
            e = scan.nextInt();
            int result = 0;
            while(min <= max) {
                int mid = (min + max) / 2;
                visited = new boolean[n + 1];
                
                if(bfs(mid)) { //s ~ e까지 mid의 중량이 건널 수 있는지 확인.
                    min = mid + 1;
                    result = mid;
                } else {
                    max = mid - 1;
                }
            }
            System.out.println(result);
        }
        
        public static boolean bfs(int mid) {
            Queue<Integer> q = new LinkedList<>();
            q.offer(s);
            visited[s] = true;
            
            while(!q.isEmpty()) {
                int temp = q.poll();
                
                if(temp == e) return true;
                
                for(int i = 0; i < list[temp].size(); i++) {
                    if(list[temp].get(i).cost >= mid && visited[list[temp].get(i).n] == false) {
                        visited[list[temp].get(i).n] = true;
                        q.offer(list[temp].get(i).n);
                    }
                }
            }
            return false;
        }
        
        public static class Node{
            int n;
            int cost;
            
            public Node(int n, int cost) {
                this.n = n;
                this.cost = cost;
            }
        }
    }
    cs

     

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

    [백준]1766: 문제집 - JAVA  (0) 2021.02.15
    [백준]10026: 적록색약 - JAVA  (0) 2021.02.14
    [백준]17136: 색종이 붙이기 - JAVA  (0) 2021.02.13
    [백준]2225: 합분해 - JAVA  (0) 2021.02.12
    [백준]1759: 암호 만들기 - JAVA  (0) 2021.02.11

    댓글

Designed by Tistory.