본문 바로가기
Algorithm/Baekjoon

1027. 고층 건물 (Python)

by 원만사 2022. 4. 12.
반응형
 

1027번: 고층 건물

세준시에는 고층 빌딩이 많다. 세준시의 서민 김지민은 가장 많은 고층 빌딩이 보이는 고층 빌딩을 찾으려고 한다. 빌딩은 총 N개가 있는데, 빌딩은 선분으로 나타낸다. i번째 빌딩 (1부터 시작)

www.acmicpc.net

 

풀이

 모든 건물에 대하여 왼쪽과 오른쪽으로 볼 수 있는 건물의 수를 카운트하여 가장 많이 보이는 빌딩의 수를 구하면 된다.

 

 기울기(y의 증가량 / x의 증가량)를 이용하여 구할 수 있는데, 이때 왼쪽의 경우는 기울기가 작아져야 볼 수 있는 건물이고 오른쪽의 경우는 기울기가 커져야 볼 수 있는 건물에 해당한다.

 

 위의 예제에서 높이가 7인 건물로 예를 들어보자. 왼쪽에 가장 먼저 건물 2가 있다. 두 건물의 지붕을 잇는 선분의 기울기는 5 (7-2 / 3-2)에 해당한다. 다음 건물 1과 건물 7의 기울기는 3 (7-1 / 3-1)이다. 이는 이전 기울기인 5보다 작아졌으므로 7번 건물에서 1번 건물을 볼 수 있다.

 

 위와 같은 식으로 왼쪽과 오른쪽에서 볼 수 있는 건물의 수를 구하여 더해주면 된다.

 

코드

# 왼쪽의 경우 기울기가 작아져야 볼 수 있는 건물에 해당
def countLeftBuilding(idx):
    minSlope = float('INF') # 최소 기울기 
    cnt = 0 # 볼 수 있는 건물의 수 

    for i in range(idx-1, -1, -1):
        slope = (buildings[idx] - buildings[i]) / (idx - i) # 기울기를 구하여

        # 이전의 최소 기울기보다 더 작아졌을 경우 최소 기울기를 갱신해주고 카운트를 추가한다.
        if minSlope > slope: 
            minSlope = slope
            cnt += 1

    return cnt


# 오른쪽의 경우 기울기가 커져야 볼 수 있는 건물에 해당
def countRightBuilding(idx):
    maxSlope = -float('INF') # 최대 기울기
    cnt = 0 # 볼 수 있는 건물의 수

    for i in range(idx+1, N):
        slope = (buildings[idx] - buildings[i]) / (idx - i) # 기울기를 구하여

        # 이전의 최대 기울기보다 더 커졌을 경우 최대 기울기를 갱신해주고 카운트를 추가한다.
        if maxSlope < slope:
            maxSlope = slope
            cnt += 1

    return cnt


if __name__ == '__main__':
    N = int(input())  # 빌딩의 수
    buildings = list(map(int, input().split()))

    res = 0

    # 모든 건물에 대하여 왼쪽과 오른쪽을 탐색하여 볼 수 있는 건물의 수를 카운트한다.
    for i in range(N):
        left = countLeftBuilding(i)
        right = countRightBuilding(i)

        res = max(res, left + right)

    print(res)
반응형

'Algorithm > Baekjoon' 카테고리의 다른 글

14466. 소가 길을 건너간 이유 6 (Python)  (0) 2022.04.14
3190. 뱀 (Python)  (0) 2022.04.13
1167. 트리의 지름 (Python)  (0) 2022.04.11
1005. ACM Craft (Python)  (0) 2022.04.11
2632. 피자판매 (Python)  (0) 2022.04.11

댓글