인자인 height는 숫자로 이루어진 배열입니다.그래프로 생각한다면 y축의 값이고,
높이 값을 갖고 있습니다. 아래의 그래프라면 height 배열은 [1, 8, 6, 2, 5, 4, 8, 3, 7] 입니다.저 그래프에 물을 담는다고 생각하고, 물을 담을 수 있는 가장 넓은 면적의 값을 반환해주세요.
당연히 물을 담아야 하기 때문에 최소 배열의 길이는 2개 이상이다.
팀원과 짝 페어를 하는데, 어느정도는 접근했으나 경우의 수가 많아 접근을 못했는데 결국 풀었다.
처음에는 접근을 배열안에서 앞뒤 비교하여 1보다 큰 8이 나오니 거시서 멈추고 그것을 면적을 뽑아낼 시작점으로 뽑아내고 마지막 배열까지 한 번 더 비교를 하면서 시작점 8에서 제일 x축인 긴 마지막 숫자인 7 에서 멈추었다. 그래서 당연히 1보다 8이 크니 8 에서 마지막 7 사이 숫자까지 에서 제일 큰 면적을 구하면 된다고 생각하였다.
그러나....
.
우리는 잘못접근 하였음을 알게 되었다. 이러한 케이스의 경우는 get_max_area([35, 46, 43, 59, 59] 이런 케이스의 경우, 46 ~ 59 사이 중 최고 면적은 46 3 = 138로 생각했으나 알고보면 35 4 =140이 더 큰 면적이라는 것을 알게되고 어떻게 접근해야 할지 문제를 다시 생각해보게 되었다.
def get_max_area(height):
maxs = 0
for i in range(len(height)):
for n in range(i+1, len(height)):
volume = 0
v = n - i
if height[i] <= height[n]:
volume = height[i] * v
else:
volume = height[n] * v
if volume >= maxs :
maxs = volume
return maxs
파이썬에서 index0번부터 시작이지만 0번째는 예시 그래프처럼 면적 구할때 치는 높이가 아니므로 시작은 1번째부터 시작하면서 찾아야한다. 그래서 v는 n-i를 해주었고
배열의 첫 번째부터 하나하나 면적을 계산합니다. 물은 가장 낮은 곳까지 차기 때문에, 면적을 구할 막대의 낮은 것과 높은 것을 구분한 뒤 낮은 곳을 기준으로 모든 경우의 수를 다 계산에서 지금까지 구한 면적보다 많으면 값을 저장해서 반복문이 끝나면 반환하게 했어요!
MODEL SOLUTION
def get_max_area(height):
l = 0
r = len(height) -1
area = 0
while l < r:
area = max(area, min(height[l],height[r]) * (r - l))
if height[l] < height[r]:
l += 1
else:
r -= 1
return area
모법 답안은 < 모든 가능한 넓이 구하고 그중 최대값 구하기 > 방식을 사용한거 같다 .
아예 배열을 돌리면서 height에 1을 더하고 빼고 해주면서 height의 값을 구했고 ,
거기에 물이 찰수 잇는 최소치부터 시작해서 max까지해서 최대치 값을 구한것 같다.