티스토리 뷰

https://www.acmicpc.net/problem/10216

 

10216번: Count Circle Groups

백준이는 국방의 의무를 수행하기 위해 떠났다. 혹독한 훈련을 무사히 마치고 나서, 정말 잘 생겼고 코딩도 잘하는 백준은 그 특기를 살려 적군의 진영을 수학적으로 분석하는 일을 맡게 되었

www.acmicpc.net

class Edge {
	constructor() {
		this.src = 0;
		this.dest = 0;
	}
}

class SubSet {
	constructor(i) {
		this.parent = i;
		this.rank = 0;
	}
}

class UF {
	constructor(N) {
		this.subsets = Array.from(Array(N), (_, i) => {
			return new SubSet(i);
		});
	}

	find(i) {
		if (this.subsets[i].parent == i) {
			return i;
		} else {
			this.subsets[i].parent = this.find(this.subsets[i].parent);
			return this.subsets[i].parent;
		}
	}

	union(x, y) {
		const xroot = this.find(x);
		const yroot = this.find(y);
		if (xroot == yroot) return;
		if (this.subsets[xroot].rank < this.subsets[yroot].rank) {
			this.subsets[xroot].parent = yroot;
		} else if (this.subsets[xroot].rank > this.subsets[yroot].rank) {
			this.subsets[yroot].parent = xroot;
		} else {
			this.subsets[xroot].parent = yroot;
			this.subsets[yroot].rank++;
		}
	}
}

const input = require('fs').readFileSync('./dev/stdin').toString().trim().split('\n');

let index = 0;
const T = +input[index++];
for (let t = 0; t < T; t++) {
	const C = +input[index++];
	const enemies = [];
	const uf = new UF(C);
	for (let c = 0; c < C; c++) {
		enemies.push(input[index + c].split(' ').map(Number));
	}

	for (let i = 0; i < C; i++) {
		for (let j = i + 1; j < C; j++) {
			if (check(enemies[i], enemies[j])) {
				uf.union(i, j);
			}
		}
	}

	const set = new Set();
	for (let k = 0; k < C; k++) {
		set.add(uf.find(k));
	}
	console.log(set.size);
	index += C;
}

function check(a, b) {
	const [ax, ay, ar] = a;
	const [bx, by, br] = b;
	const r = Math.sqrt(Math.pow(ax - bx, 2) + Math.pow(ay - by, 2));
	if (ar + br >= r) return true;
	else return false;
}
728x90
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함