<알고리즘?알고싶음!>-4

이지선·2021년 7월 31일
6

알고리즘

목록 보기
4/10
post-thumbnail

😎문제

인자인 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 해주면 끝!

profile
👩🏻‍💻

4개의 댓글

comment-user-thumbnail
2021년 7월 31일

선지님 더 나아가시는 모습 칭찬 드립니다~!

2개의 답글