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

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
developer-ellen

인간 디버거의 로그 찍기

알고리즘/알고리즘문풀

BOJ - 네트워크 복구 2211번 (JAVA)

2022. 9. 18. 20:33

❓ 문제 - 백준 네트워크 복구 2211번 - JAVA 풀이법

 

출처

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

 

2211번: 네트워크 복구

첫째 줄에 두 정수 N, M이 주어진다. 다음 M개의 줄에는 회선의 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 컴퓨터와 B번 컴퓨터가 통신 시간이 C (1 ≤ C ≤ 10)인 회선으로 연결되어 있다

www.acmicpc.net

 

 

📝 문제해결법

1. 문제

  • N개로 구성된 컴퓨터에서 1번(슈퍼컴퓨터)와 다른 컴퓨터들을 최소 경로의 비용으로 연결시켜야 한다.
  • 이때, 복구한 회선의 갯수와 복구한 회선의 수를 나타내는 두 정수 A, B를 출력한다.

 

2. 해결 방법

  • 문제를 봤을 때 N의 범위가 우선 (1 <= N <= 1000)이고, 하나의 노드(1번->슈퍼컴퓨터)에서 최소 경로로 연결하는 간선들에 대한 정보를 구하는 문제이므로 다익스트라 알고리즘을 활용한다.
  • 일반 다익스트라 알고리즘처럼 1번 노드로 부터 다익스트라를 시작해서 distance에 1번 노드로 부터의 다른 노드의 최소 간선 비용, connect에는 i번과 연결된(복구된) 다른 노드의 회선 정보를 저장한다.
  • 만약 connect[i]가 0 이라면 다른 노드와 연결되지 않은 컴퓨터이므로 복구 컴퓨터에 들어가지 않는다.

 

 

3. 느낀점

  • 일반적으로 다익스트라 알고리즘을 알고 있다면 쉽게 접근할 수 있는 문제 같았다

 

💻 소스코드 (JAVA)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main_2211 {
    public static int n, m;
    public static int[] distance, connect;
    public static int INF = (int)1e9;
    public static class Edge implements Comparable<Edge>{
        int a;
        int dis;
        public Edge(int a, int dis){
            this.a = a;
            this.dis = dis;
        }

        @Override
        public int compareTo(Edge o) {
            return this.dis - o.dis;
        }
    }

    public static ArrayList<Edge>[] list;
    public static int cnt;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        StringBuilder sb = new StringBuilder();
        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());

        list = new ArrayList[n+1];
        distance = new int[n+1];
        connect = new int[n+1];

        for(int i=0;i<n+1;i++){
            list[i] = new ArrayList<Edge>();
        }

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

            list[a].add(new Edge(b, dis));
            list[b].add(new Edge(a, dis));
        }

        Arrays.fill(distance, INF);
        dijkstra();

        for(int i=2;i<=n;i++){
            if(connect[i] == 0) continue;
            cnt++;
            sb.append(i+ " " + connect[i]+"\n");
        }
        System.out.println(cnt);
        System.out.println(sb.toString());
    }

    public static void dijkstra(){
        distance[1] = 0;
        PriorityQueue<Edge> pq = new PriorityQueue<>();
        pq.add(new Edge(1, 0));
        while (!pq.isEmpty()){
            Edge edge = pq.poll();

            if(edge.dis > distance[edge.a]) continue;

            for(Edge e:list[edge.a]){
                if(distance[e.a] > e.dis + edge.dis){
                    distance[e.a]  = e.dis + edge.dis;
                    connect[e.a] = edge.a;
                    pq.add(new Edge(e.a, distance[e.a]));
                }
            }
        }
    }
}

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

코드 트리 - 술래잡기(44번)  (1) 2022.10.08
BOJ - 게임 개발 1516번 (JAVA)  (0) 2022.09.22
BOJ - 우주신과의 교감 1774번 (JAVA)  (0) 2022.09.10
BOJ - 다리 만들기 2146번 (JAVA)  (0) 2022.09.09
BOJ - 벽 부수고 이동하기4 16946번 (JAVA)  (0) 2022.09.04
    '알고리즘/알고리즘문풀' 카테고리의 다른 글
    • 코드 트리 - 술래잡기(44번)
    • BOJ - 게임 개발 1516번 (JAVA)
    • BOJ - 우주신과의 교감 1774번 (JAVA)
    • BOJ - 다리 만들기 2146번 (JAVA)
    developer-ellen
    developer-ellen

    티스토리툴바