코딍코딍
코딩기록
코딍코딍
전체 방문자
오늘
어제
  • 분류 전체보기 (271)
    • 개발 (2)
    • Java (1)
    • 스프링 (28)
    • JPA (11)
    • Git (3)
    • 알고리즘 (160)
      • 백준 (132)
      • 프로그래머스 (8)
      • SWEA (20)
    • 토이 프로젝트 (14)
      • 간단한 Springboot CRUD (1)
      • 게시판 프로젝트 (13)
    • 알고리즘 개념정리 (8)
    • 오류 해결 (13)
    • 보류 (0)
    • AWS (5)
    • 트러블 슈팅 (0)
    • 회고 (3)
    • CS (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

최근 글

티스토리

hELLO · Designed By 정상우.
코딍코딍

코딩기록

알고리즘/백준

11724번 : 연결 요소의 개수

2022. 8. 21. 13:06

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

 

 

문제

 

 

코드

import java.io.*;
import java.util.*;

public class Main {
    static boolean visited[];
    static ArrayList<ArrayList<Integer>> g = new ArrayList<ArrayList<Integer>>();
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        visited = new boolean[n+1];

        //그래프 초기화
        for (int i = 0; i <= n; i++) {
            g.add(new ArrayList<Integer>());
        }

        for(int i=0;i<m;i++) {
            st = new StringTokenizer(br.readLine(), " ");
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            g.get(a).add(b);
            g.get(b).add(a);
        }
        int result=0;
        for(int i=1;i<=n;i++) {
            if(dfs(i)) result++;
        }

        bw.write(result + "");
        bw.flush();
    }

    public static boolean dfs(int x) {
        boolean flag = false;
        if(!visited[x]) {
            visited[x] = true;
            flag = true;
        }

        for(int i=0;i<g.get(x).size();i++) {
            int y = g.get(x).get(i);
            if(!visited[y]) {
                dfs(y);
            }
        }
        return flag;
    }
}

 

 

해결방법

첫 번째 시도: DFS를 구현하여 문제를 풀었는데 틀렸다. => 코드를 잘못 구현했다. 

두 번째 시도: 바꿔서 냈는데 또 틀렸다. => 무방향 그래프인데 방향 그래프로 만들었다.

세 번째 시도: 정답

 

첫 번째 시도는 flag를 true로 설정하는 위치가 옳지 못 하여서 아래와 같은 입력이 들어왔을 때 틀리게 나온다.

1 1       2 1
1 1       1 1
=> 0     =>0

 

두 번째 시도는 첫 번째 시도의 코드를 수정하여 위 입력이 들어왔을 때 결괏값이 잘 나오는데 백준에선 틀렸다고 해서 뭐가 문제인지 몰랐다. 문제에 무방향 그래프라고 떡하니 나와있는데 방향 그래프로 만들어서 틀린 것이다. 이를 수정해 문제를 해결하였다. 아직 많이 부족한 것 같다. 

 

'알고리즘 > 백준' 카테고리의 다른 글

4963번 : 섬의 개수  (0) 2022.08.23
7576번 : 토마토  (0) 2022.08.23
2776번 : 암기왕  (0) 2022.08.21
2357번 : 최솟값과 최댓값  (0) 2022.08.18
1302번 : 베스트셀러  (0) 2022.08.17
    '알고리즘/백준' 카테고리의 다른 글
    • 4963번 : 섬의 개수
    • 7576번 : 토마토
    • 2776번 : 암기왕
    • 2357번 : 최솟값과 최댓값
    코딍코딍
    코딍코딍
    ㅎ2

    티스토리툴바