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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

n개의 송전탑이 트리 형태로 연결되어 있다. 여기서 하나의 전선을 끊어서 네트워크를 2개로 분할하려고 한다. 이때 두 전력망이 갖게 되는 송전탑의 개수를 최대한 비슷하게 맞춰야 한다.

두 전력망이 가지고 있는 송전탑 개수의 차이(절댓값)를 return하라.

 

트리 형태이기 때문에 모든 노드가 연결이 되어 있다.

브루트포스를 통해 간선을 하나 제거하고 dfs로 탐색을 하면 하나의 그룹의 송전탑의 개수를 구할 수 있고 n개에서 그 개수를 빼면 나머지 송전탑 그룹의 개수가 결정된다.

이 방법을 지워갈 간선을 하나씩 전부 선택해 가며 반복하면서 차이의 최소를 갱신해 가면 답을 구할 수 있을 것이다.

class Solution {
    
    private int[][] graph;
    
    public int solution(int n, int[][] wires) {
        int answer = Integer.MAX_VALUE;
        initGraph(n, wires);
        for (int[] wire : wires) {
            // 이번 차례 제외할 wire
            disconnectWire(wire);
            int cnt = dfs(1, new boolean[n + 1]);
            answer = Math.min(answer, Math.abs(n - 2 * cnt));
            // 다시 연결
            connectWire(wire);
        }
        return answer;
    }
    
    private int dfs(int v, boolean[] visited) {
        visited[v] = true;
        
        int cnt = 1;
        for (int u = 0; u < visited.length; u++) {
            if (graph[v][u] == 1 && !visited[u]) {
                cnt += dfs(u, visited);
            }
        }
        
        return cnt;
    }
    
    private void initGraph(int n, int[][] wires) {
        graph = new int[n + 1][n + 1];
        
        for (int[] wire : wires) {
            connectWire(wire);
        }
    }
    
    private void disconnectWire(int[] wire) {
        int v = wire[0];
        int u = wire[1];
        graph[v][u] = 0;
        graph[u][v] = 0;
    }
    
    private void connectWire(int[] wire) {
        int v = wire[0];
        int u = wire[1];
        graph[v][u] = 1;
        graph[u][v] = 1;
    }
}

'Algorithm > Programmers' 카테고리의 다른 글

Programmers 12952 - N-Queen  (0) 2024.10.01
Programmers 87946 - 피로도  (0) 2024.10.01
Programmers 67259 - 경주로 건설  (0) 2024.09.30
Programmers 12978 - 배달  (0) 2024.09.29
Programmers 159993 - 미로 탈출  (0) 2024.09.29

+ Recent posts