https://school.programmers.co.kr/learn/courses/30/lessons/86971

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

입력

정수 n은 송전탑의 개수
2차원 정수 배열 wires는 각 송전탑을 연결하는 전선 정보

 

핵심 아이디어

모든 간선 중 하나씩 제거해보며 네트워크를 두 개로 분리
각 경우마다 DFS를 통해 한 쪽 네트워크의 노드 수를 구하고
전체 노드 수와 비교해 두 네트워크의 크기 차이를 계산
모든 경우를 탐색하면서 차이의 최솟값을 정답으로 선택

 

변수설명

list는 송전탑 간 연결 정보를 저장하는 인접 리스트
visited는 DFS 방문 여부를 저장하는 배열
cnt는 하나의 네트워크에 속한 송전탑 수
diff는 두 네트워크의 송전탑 개수 차이
dfs 함수는 한 쪽 네트워크에 포함된 송전탑의 개수를 구하기 위해 사용

 

예시

n이 9이고 wires가 [[1,3],[2,3],[3,4],[4,5],[4,6],[4,7],[7,8],[7,9]]인 경우
각 간선을 하나씩 제거해 네트워크를 두 개로 나누고
DFS로 한 쪽 크기를 구해 크기 차이 계산
가장 차이가 적은 경우를 찾아 반환
결과는 1

 

정답코드

    public int solution(int n, int[][] wires) {
        int answer = -1;

        // 여기서 노드 간선 하나씩 끊기
        for(int i=0; i<wires.length; i++){

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

            // 간선 연결
            for(int j=0; j<wires.length; j++){

                if(i == j) continue;
                int a = wires[j][0];
                int b = wires[j][1];

                list.get(a).add(b);
                list.get(b).add(a);
            }

            int[] visited = new int[n+1];
            Arrays.fill(visited, 0);

            int cnt = dfs(1, list, visited);
            int diff = Math.abs(n - 2 * cnt);
            if (answer == -1 || diff < answer) {
                answer = diff;
            }
        }

        return answer;
    }


    // dfs 는 단순히 연결되어있는 노드 개수 구하는데 사용
    public int dfs(int node, List<List<Integer>> list, int[] visited){

        visited[node] = 1;

        int cnt = 1;

        // 현재 노드와 연결된 간선 탐색
        for(int i : list.get(node)){

            if(visited[i] != 1){
                cnt += dfs(i, list, visited);
            }
        }

        return cnt;
    }

 

+ Recent posts