본문 바로가기
알고리즘 문제/Java

[goormlevel/Java] Goorm Party 1

by 현장 2026. 5. 18.

-Code

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

class Main {
	public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        // 섬마다 있는 사람 수
        st = new StringTokenizer(br.readLine());
        int[] people = new int[n + 1];
        for (int i = 1; i <= n; i++) {
            int cnt = Integer.parseInt(st.nextToken());
            people[i] = cnt;
        }
        // 왕복 다리를 담는 리스트 생성
        List<ArrayList<Integer>> bridge = new ArrayList<>();
        for (int i = 0; i <= n; i++) {
            bridge.add(new ArrayList<>());
        }
        // 왕복 다리 셋팅
        for (int i = 0; i < m; i++) {
            st = new StringTokenizer(br.readLine());
            int start = Integer.parseInt(st.nextToken());
            int end = Integer.parseInt(st.nextToken());

            // 왕복 다리이므로 양방향으로 셋팅해 줍니다!
            bridge.get(start).add(end);
            bridge.get(end).add(start);
        }
        // 이동 가능한지 dfs로 검사
        boolean[] visited = new boolean[n + 1];
        isJoin(visited, bridge, 1);
        int answer = 0;
        for (int i = 1; i <= n; i++) {
            if (visited[i]) answer += people[i];
        }
        System.out.println(answer);
    }
    // dfs로 탐색
    private static void isJoin(
            boolean[] visited, 
            List<ArrayList<Integer>> bridge, 
            int now
    ) {
        visited[now] = true;
        for (int next : bridge.get(now)) {
            if (!visited[next]) {
                isJoin(visited, bridge, next);
            }
        }
    }
}

처음에 DFS/BFS로 접근은 잘했으나 각 섬마다 검색을 하고 양방향 세팅을 해야 하는데 단반향 세팅으로 해서 틀렸었습니다. 이 2개의 문제를 알게 된 후 1번 섬만 검색하고, 양방향 세팅으로 수정하여 해결했습니다.