import sys def input(): return sys.stdin.readline().rstrip() def find_parents(X): if X == make_set[X]: return X make_set[X] = find_parents(make_set[X]) return make_set[X] def union(x,y): X = find_parents(x) Y = find_parents(y) if X !=Y: if ranks[X] < ranks[Y]: X,Y = Y,X make_set[Y] = X if ranks[X] == ranks[Y]: ranks[X] += 1 return True def connect(r1,r2): if (r1['x1'] > r2['x1'] and r1['y1'] > r2['y1'] and r1['x2'] < r2['x2'] and r1['y2'] < r2['y2']): return False if (r1['x1'] < r2['x1'] and r1['y1'] < r2['y1'] and r1['x2'] > r2['x2'] and r1['y2'] > r2['y2']): return False if (r2['x1'] > r1['x2'] or r2['x2'] < r1['x1'] or r2['y1'] > r1['y2'] or r2['y2'] < r1['y1']): return False return True N = int(input()) rect = [{ 'x1' : 0, 'x2' : 0, 'y1' : 0, 'y2' : 0 }] for _ in range(N): x1,y1,x2,y2 = map(int,input().split()) rect.append({ 'x1' : x1, 'x2' : x2, 'y1' : y1, 'y2' : y2 }) make_set = [i for i in range(N+1)] ranks = [1 for _ in range(N+1)] for i in range(N+1): for j in range(N+1): if i != j and connect(rect[i],rect[j]): if find_parents(i) != find_parents(j): union(i,j) for ind in range(N): find_parents(ind) print(len(set(make_set))-1)
어려웠던 문제였다. 이 문제를 푸는 방법은 사각형끼리 겹쳐있는지 아닌지를 판별을 해주고, 안 겹친 사각형이 총 몇개인지 세면 되는 문제였다.
단 거북이는 0,0 부터 시작하므로 0,0,0,0 으로 된 사각형이 있다고 가정하에 union find를 진행해주면 되는 문제였다.
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ/백준] 17143 낚시왕 (0) | 2021.09.03 |
---|---|
[BOJ/백준] 17090 미로 탈출하기 (0) | 2021.09.03 |
[BOJ/백준] 14938 서강그라운드 (0) | 2021.09.02 |
[BOJ/백준] 14621 나만 안되는 연애 (0) | 2021.09.02 |
[BOJ/백준] 14391 종이 조각 (0) | 2021.09.02 |