평면 위에 축에 평행한 정사각형들이 주어질 때, 각 정사각형에서 정확히 한 점씩 선택해 만든 점 집합의 **직경(diameter)**을 최대화하고, 그 직경 \(D\)의 제곱 \(D^2\)을 정수로 출력하는 문제입니다.
문제 정보
문제 링크: https://www.acmicpc.net/problem/8927
문제 요약:
- \(n\)개의 정사각형이 주어진다. 각 정사각형은 왼쪽 아래 꼭짓점 \((x,y)\)와 한 변의 길이 \(w\)로 주어진다.
- 각 정사각형에서 정확히 한 점을 선택해 \(n\)개의 점을 만든다.
- 직경은 이 점들 중 가장 먼 두 점 사이의 유클리드 거리로 정의된다.
- 직경을 최대화하는 선택에 대한 직경 \(D\)의 제곱 \(D^2\)을 출력한다.
제한 조건:
- 시간 제한: 1초
- 메모리 제한: 128MB
- \(2 \le n \le 100\,000\), \(0 \le x,y \le 10\,000\), \(1 \le w \le 10\,000\)
입출력 예제
입력 1:
| |
출력 1:
| |
접근 방식
핵심 관찰
직경을 만드는 두 점은 항상 두 정사각형의 꼭짓점으로 잡을 수 있다.
두 정사각형 \(A, B\)에서 거리를 최대화하려면, 한 점은 \(A\)의 경계(또는 내부)에서 \(B\)와 반대 방향으로 밀어낸 점이어야 하므로, 결국 \(A\)의 네 꼭짓점 중 하나, \(B\)의 네 꼭짓점 중 하나에서 최대가 된다.전체 후보는 정사각형당 4개 꼭짓점으로 총 \(4n\)개.
이 \(4n\)개 점에 대해 “서로 다른 정사각형에서 나온 두 점” 쌍 중 거리 제곱의 최댓값을 구하면 된다.볼록 껍질과 직경:
평면 위 점 집합의 직경(가장 먼 두 점)은 항상 볼록 껍질 위의 두 점(antipodal pair)으로 얻을 수 있다. 따라서 \(4n\)개 꼭짓점의 볼록 껍질을 구한 뒤, **회전하는 캘리퍼스(rotating calipers)**로 antipodal pair를 모두 보면서, 서로 다른 정사각형에서 나온 쌍에 대해서만 \(D^2\) 후보를 갱신한다.껍질 밖 점 처리:
직경을 이루는 두 점이 “둘 다 껍질 위”가 아니라 “한 점은 껍질 위, 한 점은 껍질 안”일 수 있다. 이때 껍질 안의 점에서 가장 먼 점은 항상 껍질 위에 있으므로, 각 점에 대해 껍질 위에서 가장 먼 꼭짓점을 찾고(삼분 탐색), 그 꼭짓점이 다른 정사각형일 때만 \(D^2\) 후보로 사용한다. 같은 정사각형이면 껍질 위에서 인접한 꼭짓점들 중 다른 정사각형인 것만 추가로 확인한다.
알고리즘 설계 (Mermaid)
flowchart TD
A["시작: T 테스트 케이스"] --> B["n, 정사각형 입력"]
B --> C["각 정사각형당 4개 꼭짓점으로 4n개 점 생성"]
C --> D["Andrew monotone chain으로 볼록 껍질 구하기"]
D --> E["회전하는 캘리퍼스: antipodal pair 중 서로 다른 정사각형인 쌍만 D² 후보"]
E --> F["각 점에 대해 껍질 위에서 가장 먼 꼭짓점 삼분 탐색"]
F --> G["가장 먼 꼭짓점이 다른 정사각형이면 후보 갱신, 같으면 인접 꼭짓점 중 다른 정사각형만 확인"]
G --> H["후보 중 최대 D² 출력"]
H --> I{"다음 테스트?"}
I -->|예| B
I -->|아니오| J["끝"]
단계별 로직
- 전처리: 각 정사각형 \((x,y,w)\)에 대해 네 꼭짓점 \((x,y), (x+w,y), (x,y+w), (x+w,y+w)\)을
(x, y, square_id)형태로 저장해 \(4n\)개 점 리스트를 만든다. - 볼록 껍질: x, y 기준 정렬 후 Andrew의 monotone chain으로 하단·상단 껍질을 구해 합친다.
- 회전하는 캘리퍼스: 껍질 위에서 antipodal pair를 훑으며,
square_id가 다른 쌍에 대해서만 거리 제곱의 최댓값을 갱신한다. - 점별 최대 거리: \(4n\)개 점 각각에 대해 껍질 꼭짓점을 구간으로 삼분 탐색해 “이 점에서 가장 먼 껍질 꼭짓점”을 찾고, 그 꼭짓점이 다른 정사각형이면 후보 갱신; 같은 정사각형이면 껍질 위 인접 꼭짓점 중 다른 정사각형인 것만 추가로 비교한다.
- 출력: 위에서 모은 후보 중 최대값을 정수로 출력한다.
복잡도 분석
| 항목 | 복잡도 | 비고 |
|---|---|---|
| 시간 복잡도 | \(O(n \log n)\) | 정렬·볼록 껍질 \(O(n \log n)\), 회전하는 캘리퍼스 \(O(h)\), 점별 삼분 탐색 \(O(n \log h)\) (\(h\) = 껍질 크기) |
| 공간 복잡도 | \(O(n)\) | \(4n\)개 점 및 껍질 인덱스 저장 |
구현 코드
C++
| |
Python
| |
코너 케이스 및 실수 포인트
| 케이스 | 설명 | 처리 방법 |
|---|---|---|
| n=2 | 정사각형 2개 | 두 정사각형의 4×4 꼭짓점 쌍 중 최대 거리 제곱이 답 |
| 껍질 크기 2 | 모든 점이 일직선 또는 두 점만 껍질에 남음 | rotating_calipers에서 \(H=2\) 분기로 두 꼭짓점이 서로 다른 정사각형일 때만 후보 사용 |
| 같은 정사각형 antipodal | 직경 후보가 같은 정사각형의 두 꼭짓점인 경우 | 회전하는 캘리퍼스·점별 탐색 시 sid 비교로 서로 다른 정사각형만 갱신 |
| 오버플로우 | \(D^2\)가 \(10^8\) 수준으로 커질 수 있음 | C++은 long long, Python은 정수 그대로 사용 |
| 겹치는 정사각형 | 정사각형이 겹치거나 같은 꼭짓점 공유 | 꼭짓점을 square_id와 함께 저장해 쌍 비교 시 id만 구분하면 됨 |
참고 문헌 및 출처
- 백준 8927번 Squares
- Rotating calipers (Wikipedia)
- ICPC Asia Regional - Seoul 2009 F번
![Featured image of post [Algorithm] C++ / Python 백준 8927번: Squares](/post/algorithm/2026-03-10-boj-8927-squares-cpp-python-solution/wordcloud_hu_96554c712b884396.webp)
![[Algorithm] C++ / Python 백준 11238번: Fibo](/post/algorithm/2026-03-10-boj-11238-fibo-cpp-python-solution/wordcloud_hu_becd9f0d5bbc5cc4.webp)
![[Algorithm] C++ / Python 백준 24491번: Searching for Soulmates](/post/algorithm/2026-03-10-boj-24491-searching-for-soulmates-cpp-python-solution/wordcloud_hu_d731700bc50653bc.webp)
![[Algorithm] C++ / Python 백준 8927번: Squares](/post/algorithm/2026-03-10-boj-8927-squares-cpp-python-solution/wordcloud_hu_97ca55eeba6bb341.webp)
![[Algorithm] C++ 백준 12932번: 노래방](/post/algorithm/2026-02-24-boj-12932-karaoke/wordcloud_hu_1f0c8ee66631427c.webp)
![[Algorithm] C++ 백준 16879번: 궁전 게임](/post/algorithm/2026-02-23-boj-16879-palace-game-grundy-cpp-solution/wordcloud_hu_1c61cc44e16b2b69.webp)
![[Algorithm] C++ 백준 32231번: 재우의 삼수강](/post/algorithm/2025-12-20-boj-32231-jaewoos-third-retake-hyperbolic-geometry-cpp-solution/wordcloud_hu_81b6faea477f1638.webp)
![[Algorithm] C++/Python 백준 20149번 : 선분 교차 3](/post/algorithm/2024-12-30-boj-20149/index_hu_beaa67e7202c5187.webp)
![[Algorithm] C++ 백준 16313번: Janitor Troubles](/post/algorithm/2025-12-04-boj-16313-janitor-troubles-geometry-brahmagupta-cpp-solution/wordcloud_hu_f1bb0964a165d5b9.webp)