티스토리 뷰
문제 링크
https://algospot.com/judge/problem/read/FOSSIL
주어진 두 개의 다각형을 위 껍질과 아래 껍질로 나누어 각 껍질을 삼분검색는 것이 문제의 핵심 알고리즘입니다.
삼분검색은 한 개의 지역 극대점이 있는 다음과 같은 그래프를 가지는 유니모달(Unimodal) 함수에서 그래프를 삼등분하며 탐색해나가 지역 극대점을 찾을 수 있습니다.
이러한 삼분검색을 문제에 적용하려면 다각형을 반으로 나누어 위와 같은 유니모달 형태로 만들어줘야 합니다.
문제의 테스트케이스 첫번째 입력값을 나타내면 대략 이런 모습입니다.
도형을 반으로 나눠 위쪽은 upper 아래쪽은 lower로 분류합니다.
다음은 두 도형의 겹치는 범위를 찾기 위해 두 도형의 가장 왼쪽에 있는 x좌표 중 큰값과 가장 오른쪽에 있는 x좌표 중 작은 값을 찾고 그 범위를 기준으로 1/3, 2/3 지점을 찾아 삼분탐색해 나갑니다.
이제 중간지점(aab,abb)을 하나씩 살펴보며 어느 선분 사이에 중간지점에 있으면 선분과 중간지점이 교차하는 위치를 구합니다. 이때 upper의 경우 위치들의 최소값을 lower는 위치들의 최대값을 구합니다. 그리고 upper에서 구한 위치에서 lower에서 구한 위치를 빼면 두 다각형이 겹치는 곳에서 중간지점(아래 그래프에서 aab위치)의 높이를 구할 수 있습니다. 이렇게 높이를 삼분검색으로 계속 찾아나가다보면 가장 큰 높이를 구할 수 있습니다.
구현 코드
'Coding Test > 알고스팟' 카테고리의 다른 글
[C++] 알고스팟/완전탐색 - 게임판 덮기 (0) | 2020.01.11 |
---|---|
[C++] 알고스팟/완전탐색 - 소풍 (0) | 2020.01.10 |
[C++] 알고스팟/유클리드 - 마법의 약 (0) | 2020.01.08 |
[C++] 알고스팟/에라토스테네스의 체 - 비밀번호486 (0) | 2020.01.06 |
[C++] 알고스팟/이분법 - 승률 올리기 (0) | 2020.01.05 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 합친 lis
- HiveQL
- 2225
- 분할정복
- 하이브
- Hadoop
- microwaving lunch boxes
- C++
- 삼각형 위의 최대 경로 수 세기
- 종만북
- 배열과 문자열
- pyspark
- 하둡
- hive
- 삼각형 위의 최대 경로
- Django
- 팰린드롬 구하기
- HDFS
- 백준
- Jaeha's Safe
- 외발 뛰기
- 두니발 박사의 탈옥
- Sqoop
- python
- 코딩인터뷰 완전분석
- 출전 순서 정하기
- 알고스팟
- import
- 스파크
- 완전탐색
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함