인자인 height는 숫자로 이루어진 배열입니다. 그래프로 생각한다면 y축의 값이고, 높이 값을 갖고 있습니다.
아래의 그래프라면 height 배열은 [1, 8, 6, 2, 5, 4, 8, 3, 7] 입니다.
저 그래프에 물을 담는다고 생각하고, 물을 담을 수 있는 가장 넓은 면적의 값을 반환해주세요.
배열의 길이는 2이상입니다.
for문을 돌려서 이렇게 저렇게 하고 싶은 생각만 하고
어떻게 코드를 짜야하지? 싶은 와중에 구짝꿍 동우님의 도움으로 해결!
let height = [1, 8, 6, 2, 5, 4, 8, 3, 7];
function size(w,h){
return w*h
}
function getMaxArea(height) {
let num=0;
let arr=[];
for(let i=0; i<height.length; i++){
for(let j=i+1; j<height.length; j++){
if(height[i]<height[j]){
num=size(j-i,height[i])
}else{
num=size(j-i,height[j])
}
arr.push(num)
}
}
let result = Math.max(...arr);
return result;
}
요약하자면! 두 개의 for문을 돌아서 각 각의 index값을 빼서 가로의 길이를
구해주고 배열의 인자를 높이로 지정하여 나올 수 있는 모든 넓이를 구하여
가장 큰 값을 고르는 방법!
function size(w,h){return w*h}
우선 면적을 구하기 위해 가로와 세로를 곱하는 함수를 만들어준다.
for(let i=0; i<height.length; i++){
for(let j=i+1; j<height.length; j++){
두 개의 for문을 중첩하여 돌려준다. 그러면
height[i]가 1일 때, height[j]가 8,6,2...순으로 반복하고 그 다음
height[i]가 8일 때, height[j]가 6,2,5...순으로 반복한다.
if(height[i]<height[j]){
num=size(j-i,height[i])
}else{
num=size(j-i,height[j])
} arr.push(num) }
조건문을 통해 num함수에 값을 넣어 준다.
height[i]가 작을 때 가로의 길이는 index번호 j에서 i를 뺀 값을 넣고
세로의 길이는 height[i]로 넣어준다. 반대로 height[j]가 작을 때 가로의 값은 같고 세로는 height[j]를 넣어준다. 그 값들은 arr배열에 push!
최종으로 나온 arr은 [ 1, 2, 3, 4, 5, 6, 7, 8, 6, 4, 15, 16, 40, 18, 49, 2, 10, 12, 24, 15, 36, 2, 4, 6, 8, 10, 4, 10, 9, 20, 4, 6, 12, 3, 14, 3 ]
면적으로 이루어진 배열이 완성된다.
🍬num = size(j - i, Math.min(height[j], height[i]));
위 코드는 이렇게도 줄일 수 있다! 같은 코드가 반복될 때는 조금 더
가독성 좋게 줄일 수 있는지 고민하는 습관 필요!
let result = Math.max(...arr);
return result;
arr배열에서 가장 큰 값을 return 해주면 끝!
선지님 더 나아가시는 모습 칭찬 드립니다~!