문제
https://www.acmicpc.net/problem/1027
- 빌딩은 총 N개가 있는데, 빌딩은 선분으로 나타낸다.
- i번째 빌딩 (1부터 시작)은 (i,0)부터 (i,높이)의 선분으로 나타낼 수 있다.
- 고층 빌딩 A에서 다른 고층 빌딩 B가 볼 수 있는 빌딩이 되려면, 두 지붕을 잇는 선분이 A와 B를 제외한 다른 고층 빌딩을 지나거나 접하지 않아야 한다.
- 가장 많은 빌딩이 보이는 고층 빌딩에서, 볼 수 있는 빌딩의 최대값 출력하라
주요 아이디어
- 단순 길이비교 문제가 아님에 유의할 것
- 직선의 경사를 통해 풀이하는 문제
- target의 오른쪽에 위치한 빌딩들의 경우, 이전 건물들보다 기울기가 크면 됨
- target의 왼쪽에 위치한 빌딩들의 경우, 이전 건물들보다 기울기가 작으면 됨
코드 구현 (Python 3)
def slope(x1, y1, x2, y2):
return (y2 - y1) / (x2 - x1)
n = int(input())
heights = list(map(int, input().split()))
max_building_cnt = 0
for i1, h in enumerate(heights):
cnt = 0
previous = None
# 왼쪽 빌딩들 확인
for i2 in range(i1-1, -1, -1):
if i2 == -1: break
if previous == None or slope(i1, h, i2, heights[i2]) < previous:
previous = slope(i1, h, i2, heights[i2])
cnt += 1
previous = None
# 오른쪽 빌딩들 확인
for i3 in range(i1+1, n):
if i3 == n: break
if previous == None or slope(i1, h, i3, heights[i3]) > previous:
previous = slope(i1, h, i3, heights[i3])
cnt += 1
max_building_cnt = max(cnt, max_building_cnt)
print(max_building_cnt)
제출 결과
'알고리즘 > BOJ' 카테고리의 다른 글
[BOJ] 1931. 회의실 배정 (0) | 2025.01.22 |
---|---|
[BOJ] 14503. 로봇 청소기 (0) | 2024.07.05 |
[BOJ] 5427. 불 (0) | 2024.06.25 |
[BOJ] 1181. 단어 정렬 (0) | 2024.06.25 |
[BOJ] 10026. 적록색약 (0) | 2024.06.25 |