인자인 height는 숫자로 이루어진 배열입니다.그래프로 생각한다면 y축의 값이고,
높이 값을 갖고 있습니다.
아래의 그래프라면 height 배열은 [1, 8, 6, 2, 5, 4, 8, 3, 7] 입니다.
저 그래프에 물을 담는다고 생각하고, 물을 담을 수 있는 가장 넓은 면적의 값을 반환해주세요.
배열의 길이는 2이상입니다.
가장 큰 면적을 구해야 하기 때문에, 하나하나 그래프의 높이 만큼 만들수 있는 최대의 높이를 구해야 한다고 생각했다.
def calc_distance(num1, num2):
dis = num1 - num2
return dis * -1 if dis < 0 else dis
def chk_num(num1, num2):
return num1 if num1 < num2 else num2
def get_max_area(height):
max = 0
for i in range(0, len(height)):
for j in range(0, len(height)):
if i == j: continue
if max < calc_distance(i, j) * chk_num(height[i], height[j]):
max = calc_distance(i, j) * chk_num(height[i], height[j])
return max
위의 코드는 한번 계산했던 걸 다시 계산하는 중복이 발생 하는데 중복을 제외할 수 없을까 생각하다 바깥 for문의 i를 안쪽 for문의 start지점으로 받아 주면 지나 왔던 캔들을 다시 계산 안해도 되고 마이너스 거리도 생각 안해도 된다는 점이 떠올라서 아래와 같이 소스코드를 수정 했다.
def calc_distance(num1, num2):
return num2 - num1
def chk_num(num1, num2):
return num1 if num1 < num2 else num2
def get_max_area(height):
max = 0
for i in range(0, len(height)):
for j in range(i, len(height)):
if i == j: continue
if max < calc_distance(i, j) * chk_num(height[i], height[j]):
max = calc_distance(i, j) * chk_num(height[i], height[j])
return max