250x250
250x250
JinSeopKim
Hello World!
JinSeopKim
전체 방문자
오늘
어제
  • 분류 전체보기 (168)
    • Artificial intelligence (14)
      • DeepDiveToAI (3)
      • Pytorch (3)
      • Etc (8)
    • Back-end (19)
      • Spring (10)
      • JPA (9)
    • Language (24)
      • Python (3)
      • Java (11)
      • Swift (10)
    • Math (4)
      • Linear Algebra (4)
    • CodingTest (79)
      • Algolithm (12)
      • Backjoon (25)
      • Programmers (42)
    • Etc (27)
      • Book Review (3)
      • Adsp (6)
      • Life (2)
      • Docker (1)
      • odds and ends (15)
    • AI Life (0)
      • 생각 넓히기 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • GitHub

인기 글

태그

  • uArm
  • 선형대수
  • 개발
  • JPA
  • swift
  • BOJ
  • BFS
  • 구현
  • 알고리즘
  • Python
  • JAVA8
  • 카카오
  • certificate
  • 문제풀이
  • ios
  • AI
  • data
  • 파이썬
  • 백준
  • 브루트포스
  • 머신러닝
  • ADsP
  • java
  • DP
  • 코딩테스트
  • 프로그래머스
  • SpringMVC
  • Front-end
  • 개발자
  • 자바

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
JinSeopKim

Hello World!

[BOJ_11724] 연결요소 (java)
CodingTest/Backjoon

[BOJ_11724] 연결요소 (java)

2021. 12. 14. 04:18
728x90
728x90

문제링크

https://www.acmicpc.net/problem/11724

 

11724번: 연결 요소의 개수

첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주

www.acmicpc.net

문제설명

더보기
더보기

문제

방향 없는 그래프가 주어졌을 때, 연결 요소 (Connected Component)의 개수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주어진다.

출력

첫째 줄에 연결 요소의 개수를 출력한다.

제한사항

제한시간 메모리제한
3초 512MB

문제풀이

👨🏻‍💻 핵심 스킬 👨🏻‍💻
DFS, BFS를 사용해서 해결하자.

연결요소 2개

연결요소는 그래프가 연결되어 있는 요소들을 의미합니다. 위 그림을 보면 그래프가 2개라고 표현할 수도 있지만 이것은 연결요소가 2개라고도 표현할 수 있습니다. 그래프의 연결된 모든 정점을 한번씩만 탐색해보는 그리디 알고리즘은 BFS와 DFS를 사용하면 연결되어있는 모든 정점에 대하여 확인할 수 있습니다. 따라서 모든 정점을 돌며 DFS 혹은 BFS로 체크가 되어 있지 않다면 그와 연결된 모든 연결요소를 체크하여주면서 연결요소의 수를 간단히 구할 수 있습니다.

 

저는 문제를 해결하기 위해 dfs를 사용하였습니다. 아래 구현코드를 참고하여 확인해주시면 감사하겠습니다.

 

구현코드

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int vertexSize = sc.nextInt();
        int edgeSize = sc.nextInt();

        ArrayList<Integer>[] edgeList = new ArrayList[vertexSize+1];
        for(int i = 1; i <= vertexSize; i++)
            edgeList[i] = new ArrayList<Integer>();

        for(int i = 0; i < edgeSize; i++){
            int firstVertex = sc.nextInt();
            int secondVertex = sc.nextInt();

            edgeList[firstVertex].add(secondVertex);
            edgeList[secondVertex].add(firstVertex);
        }

        boolean[] checked = new boolean[vertexSize+1];
        int count = 0;
        for(int i = 1; i <= vertexSize; i++){
            if(!checked[i]){
                dfs(i,checked,edgeList);
                count += 1;
            }
        }
        System.out.println(count);
    }

    public static void dfs(int x, boolean[] checked, ArrayList<Integer>[] edgeList){
        checked[x] = true;
        ArrayList<Integer> vertexs = edgeList[x];
        for(int i = 0; i < vertexs.size(); i++){
            int ver =vertexs.get(i);
            if(!checked[ver])
                dfs(ver,checked,edgeList);
        }
    }
}

 

시간복잡도

간선을 인접리스트로 구현하였으며 DFS 혹은 BFS는 모든 정점에 대하여 한번씩 수행되므로 V(정점의 개수)가 걸리며, 반복문으로 연결되어있는 정점을 확인하는데 이는 E(간선의 수)만큼 확인하게 됩니다.

따라서 시간 복잡도는 $O(V+E)$가 됩니다.

728x90
728x90
저작자표시 비영리 (새창열림)

'CodingTest > Backjoon' 카테고리의 다른 글

[BOJ_2667] 단지번호붙이기 (java)  (0) 2021.12.16
[BOJ_1707] 이분그래프 (java)  (0) 2021.12.15
[BOJ_2156] 포도주 시식 (java)  (0) 2021.11.28
[backjoon_11057] 오르막 수 (Java)  (0) 2021.11.21
[backjoon_2225] 합분해 (Java)  (0) 2021.11.21
    'CodingTest/Backjoon' 카테고리의 다른 글
    • [BOJ_2667] 단지번호붙이기 (java)
    • [BOJ_1707] 이분그래프 (java)
    • [BOJ_2156] 포도주 시식 (java)
    • [backjoon_11057] 오르막 수 (Java)
    JinSeopKim
    JinSeopKim
    기록📚

    티스토리툴바