TIL.36 js 코드카타 5.

Haiin·2020년 12월 11일
0

위코드 자바스크립트 코드카타 5.
출저 : 위코드 코드카다 자료



문제

인자인 height는 숫자로 이루어진 배열입니다.
그래프로 생각한다면 y축의 값이고, 높이 값을 갖고 있습니다.
아래의 그래프라면 height 배열은 [1, 8, 6, 2, 5, 4, 8, 3, 7] 입니다.
저 그래프에 물을 담는다고 생각하고,
물을 담을 수 있는 가장 넓은 면적의 값을 반환해주세요.
!!!가정
배열의 길이는 2이상입니다.



풀이

  • 처음의 접근은 배열에서 최대값을 찾아 인덱스를 어떻게 반환하나 였다. 하지만 넓이를 구해야 하므로 두번째 최대값을 찾을때부터 막히기 시작했고 배열의 특성을 살려 배열안의 값들을 비교하여 넓이를 먼저 구하고 그 넓이들 중 최대값을 찾는 방법이 용이하다고 생각되었다.
  • 이중 for문으로 인덱스를 순서대로 비교해주고 물은 작은 높이에 고이기 때문에 작은 값에 가로 값(인덱스값의 차이)을 곱해줘서 넓이 값을 구했다.
  • 넓이만 담는 배열을 만들어주고 최대값을 찾기위해 Math.max()에 apply메서드를 더해줘서 숫자로 만들어 주지 않고도 바로 최대값을 반환하도록 했다.
function getMaxArea(height) {
 let arr = []
 let aa
  for (i=0; i < height.length; i ++) {
    for (j=i+1; j < height.length; j ++) {
      if (height[i] < height[j]) {
        aa = height[i]*(j-i)
      } else {
        aa = height[j]*(j-i)
      }      
      arr.push(aa)
    }
  } 
  let max = Math.max.apply(null, arr)
  return max
}
getMaxArea([35, 46, 43, 59, 59])
//140


다른풀이

  • 모델솔루션도 이중 for문을 사용하여 배열의 값을 비교하였고, Math.min을 활용하여 숫자 그래로를 비교하여 넓이값을 바로 반환하였다.
  • Math.max 와 Math.min 은 배열을 직접 사용하지 못하기 때문에 아래 코드처럼 for문 안에 바로 숫자를 비교할 수 있는 장점이 있다는 걸 배웠다.
function getMaxArea(height) {
    let size = 0;  
    for (let i = 0; i < height.length; i++) {
        for (let j = i+1; j < height.length; j++) {
            size = Math.max(Math.min(height[i], height[j]) * (j-i), size);
        }
    }    
    return size;
}


0개의 댓글