๐ก Info
๋ด์ฉ
N๊ฐ์ ์ ๋ถ๋ค์ด 2์ฐจ์ ํ๋ฉด์์ ์ฃผ์ด์ ธ ์๋ค. ์ ๋ถ์ ์ ๋์ ์ x, y ์ขํ๋ก ํํ์ด ๋๋ค.
๋ ์ ๋ถ์ด ์๋ก ๋ง๋๋ ๊ฒฝ์ฐ์, ๋ ์ ๋ถ์ ๊ฐ์ ๊ทธ๋ฃน์ ์ํ๋ค๊ณ ์ ์ํ๋ฉฐ, ๊ทธ๋ฃน์ ํฌ๊ธฐ๋ ๊ทธ ๊ทธ๋ฃน์ ์ํ ์ ๋ถ์ ๊ฐ์๋ก ์ ์ํ๋ค. ๋ ์ ๋ถ์ด ๋ง๋๋ค๋ ๊ฒ์ ์ ๋ถ์ ๋์ ์ ์ค์น๋ฏ์ด ๋ง๋๋ ๊ฒฝ์ฐ๋ ํฌํจํ๋ ๊ฒ์ผ๋ก ํ๋ค.
N๊ฐ์ ์ ๋ถ๋ค์ด ์ฃผ์ด์ก์ ๋, ์ด ์ ๋ถ๋ค์ ์ด ๋ช ๊ฐ์ ๊ทธ๋ฃน์ผ๋ก ๋์ด ์์๊น? ๋, ๊ฐ์ฅ ํฌ๊ธฐ๊ฐ ํฐ ๊ทธ๋ฃน์ ์ํ ์ ๋ถ์ ๊ฐ์๋ ๋ช ๊ฐ์ผ๊น? ์ด ๋ ๊ฐ์ง๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํด ๋ณด์.
๐ฅ์ ๋ ฅ ์กฐ๊ฑด
# 1
3
1 1 2 3
2 1 0 0
1 0 1 1
# 2
3
-1 -1 1 1
-2 -2 2 2
0 1 -1 0
๐ค์ถ๋ ฅ ์กฐ๊ฑด
# 1
1
3
# 2
2
2
์ค์ ํ์ด ์๊ฐ : 1์๊ฐ 20๋ถ(์ฒซ ํ์ด ์๊ฐ ํฌํจ)
import java.util.*;
public class Main {
static int[] parent;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
Line[] lines = new Line[n];
parent = new int[n];
for (int i = 0; i < n; i++) {
lines[i] = new Line(sc.nextInt(), sc.nextInt(), sc.nextInt(), sc.nextInt());
parent[i] = i;
}
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
if (meet(lines[i], lines[j])) {
union(i, j);
}
}
}
Map<Integer, Integer> groupCount = new HashMap<>();
int maxSize = 1;
for (int i = 0; i < n; i++) {
int groupParent = getParent(i);
groupCount.put(groupParent, groupCount.getOrDefault(groupParent, 0) + 1);
maxSize = Math.max(maxSize, groupCount.get(groupParent));
}
System.out.println(groupCount.size());
System.out.println(maxSize);
}
static int getParent(int idx) {
if (parent[idx] != idx) {
parent[idx] = getParent(parent[idx]);
}
return parent[idx];
}
static boolean meet(Line l1, Line l2) {
int res1 = ccw(l1, l2.x1, l2.y1) * ccw(l1, l2.x2, l2.y2);
int res2 = ccw(l2, l1.x1, l1.y1) * ccw(l2, l1.x2, l1.y2);
if (res1 == 0 && res2 == 0) {
return Math.min(l1.x1, l1.x2) <= Math.max(l2.x1, l2.x2) &&
Math.min(l2.x1, l2.x2) <= Math.max(l1.x1, l1.x2) &&
Math.min(l1.y1, l1.y2) <= Math.max(l2.y1, l2.y2) &&
Math.min(l2.y1, l2.y2) <= Math.max(l1.y1, l1.y2);
} else {
return res1 <= 0 && res2 <= 0;
}
}
static int ccw(Line l1, int x3, int y3) {
int x1 = l1.x1, y1 = l1.y1, x2 = l1.x2, y2 = l1.y2;
long result = (long) (x2 - x1) * (y3 - y1) - (long) (y2 - y1) * (x3 - x1);
if (result == 0) return 0;
return result > 0 ? 1 : -1;
}
static void union(int i, int j) {
int rootI = getParent(i);
int rootJ = getParent(j);
if (rootI != rootJ) {
parent[rootI] = rootJ;
}
}
static class Line {
int x1, y1, x2, y2;
public Line(int x1, int y1, int x2, int y2) {
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
}
}
}