문제 링크
- http://icpc.me/9015
문제 출처
- 2012 ACM-ICPC 대전 인터넷 예선 J번
시간복잡도
- O(n2 log n)
풀이
n 제한이 최대 3000이기 때문에 O(n3)보다는 빠른 복잡도를 가진 알고리즘을 고안해내야 합니다.
이 문제는 이데일리 코딩 챌린지 예선에 잘못된 데이터와 함께 나왔던 문제이기 때문에 쉽게 풀 수 있었습니다.
정사각형은 모든 각이 90도이며 모든 변의 길이가 동일합니다. 이 점을 이용해 O(n2 log n2) 정도의 알고리즘을 만들 수 있습니다.
먼저 아무 두 점을 잡고, 그 두 점의 좌표를 각각 (x1, y1), (x2, y2)라고 잡읍시다. 또한 계산의 편의를 위해 x1-x2를 a, y1-y2를 b라고 합시다.
만약 주어진 점들 중 (x1+b, y1-a)와 (x2+b, y2-a)의 좌표를 가진 점이 모두 있다면, 네 점을 이어 정사각형을 만들 수 있습니다.
아무 두 점을 잡는데 O(n2)이 걸리고, set을 이용한다면 특정 좌표에 점이 있는지는 O(log n)에 구할 수 있습니다.
다만, set의 구현체인 Red-Black Tree는 시간 복잡도의 상수가 매우 커서 데이터가 많으면 시간 초과가 날 수 있기 때문에 데이터를 적절히 분산해서 넣어주어야 합니다.
전체 코드
1 |
|