https://www.acmicpc.net/problem/2162
2162번: 선분 그룹
첫째 줄에 N(1 ≤ N ≤ 3,000)이 주어진다. 둘째 줄부터 N+1번째 줄에는 양 끝점의 좌표가 x1, y1, x2, y2의 순서로 주어진다. 각 좌표의 절댓값은 5,000을 넘지 않으며, 입력되는 좌표 사이에는 빈칸이 하
www.acmicpc.net
나는 이 문제를 풀기 전에 CCW 알고리즘의 응용 버전인 골드 2 문제, 선분교차 2를 풀었기 때문에 그를 이용하여 쉽게 풀 수 있었다.
다음 문제의 아이디어는 다음과 같다.
1.CCW 알고리즘(벡터의 외적)을 이용하여 많은 조건 분기로 선분 교차를 판정하는 함수를 정의한다.
2.Union-Find 자료구조를 활용하여 선분을 통합한다.
3.그룹의 수와 가장 많은 선분을 가진 그룹의 선분 개수를 세준다.
코드는 다음과 같다.
def ccw(x1, y1, x2, y2, x3, y3):
return ((x2-x1)*(y3-y2))-((x3-x2)*(y2-y1))
def subun(x1, y1, x2, y2, x3, y3, x4, y4):
if ccw(x1,y1,x2,y2,x3,y3)==ccw(x1,y1,x2,y2,x4,y4) == ccw(x3,y3,x4,y4,x1,y1)==ccw(x3,y3,x4,y4,x2,y2) == 0:
if min(x1, x2) <= x3 <= max(x1, x2) and min(y1, y2) <= y3 <= max(y1, y2):
return 1
elif min(x1, x2) <= x4 <= max(x1, x2) and min(y1, y2) <= y4 <= max(y1, y2):
return 1
elif min(x3, x4) <= x1 <= max(x3, x4) and min(y3, y4) <= y1 <= max(y3, y4):
return 1
elif min(x3, x4) <= x2 <= max(x3, x4) and min(y3, y4) <= y2 <= max(y3, y4):
return 1
else: return 0
elif ccw(x1,y1,x2,y2,x3,y3)*ccw(x1,y1,x2,y2,x4,y4) <= 0 and ccw(x3,y3,x4,y4,x1,y1)*ccw(x3,y3,x4,y4,x2,y2) <= 0:
return 1
else:
return 0
momnode = [i for i in range(3001)]
def find(x):
if x != momnode[x]:
momnode[x] = find(momnode[x])
return momnode[x]
def union(x, y):
momnode[find(y)] = find(x)
arry = []
n = int(input())
for i in range(n):
a, b, c, d = map(int, input().split())
arry.append((a,b,c,d))
for i in range(n):
for j in range(n):
if i != j:
pan = subun(arry[i][0], arry[i][1], arry[i][2], arry[i][3], arry[j][0], arry[j][1], arry[j][2], arry[j][3])
if pan:
if find(i) != find(j):
union(min(i,j), max(i,j))
cont = 0
for i in range(n):
if find(i) == i:
cont += 1
group = [0]*n
for i in range(n):
group[find(i)] += 1
print(cont)
print(max(group))
'PS문제풀이' 카테고리의 다른 글
하노이탑에 대하여 (1) | 2023.11.19 |
---|---|
백준 1647:도시 분할 계획(python) 크루스칼 알고리즘 (0) | 2023.07.29 |
백준 27172-수 나누기 게임(python) (에라토스테네스 아이디어 응용) (0) | 2023.07.29 |
백준 2623 음악프로그램 위상정렬 알고리즘 (0) | 2023.07.27 |
[그리디 알고리즘]1700-멀티탭 스케줄링 (0) | 2023.07.16 |