개발머해니

[파이썬] 런던 폭우 - 브루트 포스 본문

알고리즘

[파이썬] 런던 폭우 - 브루트 포스

왕행님 2023. 9. 16. 20:55
728x90
반응형

실습 설명

런던에 엄청난 폭우가 쏟아진다고 가정합시다. 정말 재난 영화에서나 나올 법한 양의 비가 내려서, 고층 건물이 비에 잠길 정도입니다.

그렇게 되었을 때, 건물과 건물 사이에 얼마큼의 빗물이 담길 수 있는지 알고 싶은데요. 그것을 계산해 주는 함수 trapping_rain을 작성해 보려고 합니다.

함수 trapping_rain은 건물 높이 정보를 보관하는 리스트 buildings를 파라미터로 받고, 담기는 빗물의 총량을 리턴해 줍니다.

예를 들어서 파라미터 buildings로 [3, 0, 0, 2, 0, 4]가 들어왔다고 합시다. 그러면 0번 인덱스에 높이 3의 건물이, 3번 인덱스에 높이 2의 건물이, 5번 인덱스에 높이 4의 건물이 있다는 뜻입니다. 1번, 2번, 4번 인덱스에는 건물이 없습니다.

그러면 아래의 사진에 따라 총 10만큼의 빗물이 담길 수 있습니다. 따라서 trapping_rain 함수는 10을 리턴하는 거죠.

이번에는 파라미터 buildings로 [0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1]가 들어왔다고 합시다. 그러면 아래의 사진에 따라 총 6 만큼의 빗물이 담길 수 있습니다. 따라서 trapping_rain 함수는 6을 리턴하는 거죠

이 정보를 기반으로, trapping_rain 함수를 작성해 보세요!

 

실습 결과

def trapping_rain(buildings):
    totl_water = 0
    right_max = 0
    left_max = max(buildings)
    
    for i in range(1, len(buildings)-1) :
        # 오른 건물의 높이 구하기
        right_height = buildings[i-1]
        if right_height > right_max:
            right_max = right_height
        
        # 왼쪽 건물의 높이 구하기
        left_height = buildings[i+1]
        if left_height > left_max:
            left_max = left_height
        
        # 양쪽 중 더 낮은 건물 - 본인 높이 만큼 물 채우기
        totl_water += min(right_max, left_max) - buildings[i]
            
    return totl_water

# 테스트
print(trapping_rain([3, 0, 0, 2, 0, 4]))
print(trapping_rain([0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1]))
10
6
728x90
반응형