반응형
https://www.acmicpc.net/problem/1027
1027번: 고층 건물
세준시에는 고층 빌딩이 많다. 세준시의 서민 김지민은 가장 많은 고층 빌딩이 보이는 고층 빌딩을 찾으려고 한다. 빌딩은 총 N개가 있는데, 빌딩은 선분으로 나타낸다. i번째 빌딩 (1부터 시작)
www.acmicpc.net
해결 방법 : 브루트포스
- 각 건물에서 모든 경우를 탐색
- 건물 X에 대해, X에서 왼쪽으로 탐색을 진행한다면 (건물 X와 왼쪽의 건물X' )의 꼭대기를 잇는 직선의 기울기가 이전의 기울기 보다 작아질 때, 건물 X'를 볼 수 있음을 알 수 있다.
- 오른쪽 건물 X''의 경우 기울기가 커질 때 해당 건물을 볼 수 있다.
- 따라서 임의의 건물 X를 기준으로 left, right로 각각 모든 건물을 탐색하며 left 방향은 기울기가 작아지는 갱신 count, right 방향은 기울기가 커지는 갱신 count를 합한 것이 X에서 볼 수 있는 건물을 수가 된다.
import sys
input = sys.stdin.readline
def solution(N, heights):
counts = [0] * N # 해당 건물에서 볼 수 있는 다른 건물 수
weight = lambda x1,y1,x2,y2 : (y2 - y1) / (x2 - x1) # 기울기 구하기
for x in range(N): # 브루트포스
l_w, r_w = float('inf'), -float('inf') # left는 min 방향 탐색, right는 max 방향 탐색이므로
for l_x in range(x - 1, -1, -1): # 왼쪽 건물들 탐색
n_w = weight(x, heights[x], l_x, heights[l_x]) # 기울기
if n_w < l_w: # 더 작아지면 갱신 및 count ++
l_w = n_w
counts[x] += 1
for r_x in range(x + 1, N):
n_w = weight(x, heights[x], r_x, heights[r_x])
if n_w > r_w: # 더 커지면 갱신 및 count ++
r_w = n_w
counts[x] += 1
return max(counts)
if __name__ == '__main__':
N = int(input())
heights = list(map(int, input().split()))
result = solution(N, heights)
print(result)
반응형
'IT study > 알고리즘 문제 풀이' 카테고리의 다른 글
백준 1003 : 피보나치 함수 (백준 4150 : 피보나치 수) (0) | 2021.08.17 |
---|---|
백준 16156 : 장애물 달리기 (1) | 2021.08.16 |
백준 3182 : 한동이는 공부가 하기 싫어! (0) | 2021.08.14 |
백준 3077 : 임진왜란 (0) | 2021.08.12 |
백준 9081 : 단어 맞추기 (0) | 2021.08.11 |