본문으로 바로가기

PGMS 전력망을 둘로 나누기

category Algorithm/PGMS 2022. 1. 10. 23:01

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

 

코딩테스트 연습 - 전력망을 둘로 나누기

9 [[1,3],[2,3],[3,4],[4,5],[4,6],[4,7],[7,8],[7,9]] 3 7 [[1,2],[2,7],[3,7],[3,4],[4,5],[6,7]] 1

programmers.co.kr

function solution(n, wires) {
	var answer = -1;
	let min = Math.max;
	let root = [];
	for (let j = 0; j < wires.length; j++) {
		root = [];
		for (let i = 0; i <= n; i++) {
			root.push(i);
		}
		wires.forEach(([x, y], k) => {
			if (k != j) union(x, y);
		});
		let cnt = 1;
		for (let i = 2; i <= n; i++) {
			let iroot = find(i);
			if (iroot == find(1)) {
				cnt++;
			}
		}
		let rest = n - cnt;
		cnt = Math.abs(cnt - rest);
		min = min < cnt ? min : cnt;
	}

	return min;

	function union(x, y) {
		let xroot = find(x);
		let yroot = find(y);
		if (yroot > xroot) root[yroot] = xroot;
		else root[xroot] = yroot;
	}

	function find(x) {
		if (root[x] == x) {
			return x;
		} else {
			return (root[x] = find(root[x]));
		}
	}
}

Union Find를 통해서 해결하였다.

 

문제해결 아이디어는

 

1. 반복문을 돌면서 wire 하나씩 제외하고 Union Find

2. 이후 구한 Parent(여기서는 root)에서 첫번쨰 요소와 같은 개수를 구함

 

Union Find를 함수로 묶는게 더 깔끔했을것 같다.

 

오롯이 자기 힘으로 유니온 파인드 문제를 푼게 처음이라 기분이 좋다.

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

PGMS - 소수찾기  (0) 2022.01.13
PGMS 점프와 순간이동  (0) 2022.01.10
PGMS 캐시  (0) 2022.01.10
PGMS 거리두기 확인하기  (0) 2021.12.29
PGMS 메뉴 리뉴얼  (0) 2021.12.29