5. min max 트렌드를 따라가지 못하는 늙은 코딩

 

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

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

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

 

 

해설

  1. 현재 인덱스의 왼쪽에서 가장 높은 건물의 높이를 구한다
  2. 현재 인덱스의 오른쪽에서 가장 높은 건물의 높이를 구한다
  3. 그 중 더 낮은 건물의 높이를 구한다
  4. 그 높이에서 현재 인덱스에 있는 건물의 높이를 뺀다
def trapping_rain(buildings):
    # 총 담기는 빗물의 양을 변수에 저장
    total_height = 0

    # 리스트의 각 인덱스을 돌면서 해당 칸에 담기는 빗물의 양을 구한다
    # 0번 인덱스와 마지막 인덱스는 볼 필요 없다
    for i in range(1, len(buildings) - 1):
        # 현재 인덱스를 기준으로 양쪽에 가장 높은 건물의 위치를 구한다
        max_left = max(buildings[:i])
        max_right = max(buildings[i:])

        # 현재 인덱스에 빗물이 담길 수 있는 높이
        upper_bound = min(max_left, max_right)

        # 현재 인덱스에 담기는 빗물의 양을 계산
        # 만약 upper_bound가 현재 인덱스 건물보다 높지 않다면, 현재 인덱스에 담기는 빗물은 0
        total_height += max(0, upper_bound - buildings[i])

    return total_height

# 테스트 코드
print(trapping_rain([0, 3, 0, 0, 2, 0, 4]))
print(trapping_rain([0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1]))

 

 

내풀이

def trapping_rain(buildings):
    # 여기에 코드를 작성하세요
    left = 0
    right = 0
    fin = 0
    res = 0
    for i in range (len(buildings)):
         left = 0
         right = 0
         for j in range (0,i):
             #print(buildings[j])
             if (buildings[j] >= left):
                 left = buildings[j]
         for k in range (i+1,len(buildings)):
             if (buildings[k] >= right):
                 right = buildings[k]

         if (left > right):
             fin = right
         else:
             fin = left
         
         if ((fin - buildings[i]) <0):
             continue
         res += (fin - buildings[i])
         
    return res
        
# 테스트
print(trapping_rain([3, 0, 0, 2, 0, 4]))
print(trapping_rain([0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1]))

 

눈물 난다.

min max 함수를 쓰자.....