programming/알고리즘
[프로그래머스, 자바] PG_전력망을둘로나누기
s2econd.blue
2022. 8. 25. 14:51
링크 : https://school.programmers.co.kr/learn/courses/30/lessons/86971?language=java
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1. 문제 핵심
- N개 송전탑은 트리 형태로 모두 연결되어 있음.
2. 문제 접근
1. 모든 송전탑은 이어져있고 이 트리를 2개로 나누는 것이기 때문에 하나만 잇지 않아도 두 개로 쉽게 나눌 수 있음.
2. 가장 간단한 접근법은 모든 전선을 처음부터 하나씩 마지막까지 한 개씩만 연결하지 않고 송전탑은 이은 뒤, 두 트리로 나뉘어진 송전탑의 개수 차이를 구하는 것.
3. 하나의 전선을 제외한 전선은 유니온 파인드로 묶으면 각 트리에 몇 개의 송신탑이 존재하는지 확인.
3. 자바 코드
더보기
import java.util.*;
import java.io.*;
class Solution {
static int[]set;
public static int FindSet(int a){
//음수일 경우 루트
if(set[a] < 0){
return a;
}
return set[a] = FindSet(set[a]);
}
public static void Union(int a, int b){
//루트까지 올라갔을 때
a = FindSet(a);
b = FindSet(b);
// System.out.println(a+" " + b);
// System.out.println(set[0]);
//루트가 같으면
if(a != b){
if(set[a] < set[b]){
set[a] += set[b];
set[b] = a;
}
else{
set[b] += set[a];
set[a] = b;
}
}
}
public int solution(int n, int[][] wires) {
int num1 = 0, num2 = 0;
int answer = 10000;
//하나씩 와이어를 지우면서
for(int i = 0; i < n-1;i++){
set = new int[n+1];
for(int j = 1; j < n+1; j++)
set[j] = -1;
num1 = 0;
num2 = 0;
//매번 와이어 연결
for(int j = 0; j < n-1;j++){
//와이어 하나씩 연결하지 않음
if(i == j)
continue;
Union(wires[j][0],wires[j][1]);
}
for(int j = 1; j < n+1;j++){
if(set[j] < 0){
if(num1 == 0)
num1 = set[j];
else{
num2 = set[j];
break;
}
}
}
answer = Math.min(answer, Math.abs(num1 - num2));
}
return answer;
}
}