코드카타 2주차 #5

김태현·2020년 11월 13일
0

코드카타

목록 보기
9/9
post-thumbnail
  • 문제
    인자인 height는 숫자로 이루어진 배열입니다.
    그래프로 생각한다면 y축의 값이고, 높이 값을 갖고 있습니다.

아래의 그래프라면 height 배열은 [1, 8, 6, 2, 5, 4, 8, 3, 7] 입니다.

저 그래프에 물을 담는다고 생각하고,
물을 담을 수 있는 가장 넓은 면적의 값을 반환해주세요.

  • 가정
    배열의 길이는 2이상입니다.

풀이

function getMaxArea(height) {
  let array = [];
  if(height.length >= 2) {
    for(let i = 0; i < height.length-1; i++) {
      for(let j = i+1; j <height.length; j++) {
        let h = Math.min(height[i], height[j]);
        let w = j - i;
        let result = h * w;
        array.push(result);
      }
    }
    array.sort((a,b) => {
      return b - a;
    })
    return array.slice(0, 1)[0];
  }
}

getMaxArea([1, 8, 6, 2, 5, 4, 8, 3, 7]);

저번 문제를 응용해서 풀었다 ~
먼저 빈 배열을 선언했다!

여기에 모든 면적값들을 넣고 sort와 slice를 사용해서 최대값을 리턴할것이다 ~
배열의 길이가 2이상이어야 하므로 height.length >=2 조건을 주고 이중 for문으로 각각의 너비의 경우를 전부 따져줬다!

면적의 높이가 되는 h는 둘 중 길이를 비교해서 짧은 길이를 높이로 삼는다
왜냐하면 높은 길이를 기준으로 삼으면은 물이 흘러 넘치기 때문!!

면적의 너비가 되는 w는 인덱스 간의 차다
그래서 둘을 곱해버리면 너비가 생성된다 ~~

근데 현재 for문 안에 있으므로 면적 값이 계속 i, j에 따라서 변하니까 값을 비교할 수가 없다!!
따라서 이 모든 면적값을 빈 배열에 push를 해줘서 나중에 이 배열을 가지고 비교를 해줄거다~
배열에 값이 잘 담겨졌으면 지금 무작위로 값이 담겨있기 때문에 sort를 사용해서 내림차순 정렬을 해야한다!
왜냐하면 문제가 원하는 것이 최대값이니까 ~~

sort의 사용법! 다시 한번 숙지하자 !
먼저 내림차순 일때!!

const array = [1,2,3,4,5,6]
array.sort((a,b) => {
  return b - a;
})

array의 리턴값은 다음과 같다! [6,5,4,3,2,1]

그리고 오름차순 일때는
return에 b - a 부분을 a - b로 바꿔주면 된다
이렇게 정렬하면 리턴값은 다음과 같다! [1,2,3,4,5,6]

이렇게 배열의 요소들을 정렬했으면 남은건 가장 앞에 있는값 하나만 잘라서 리턴해주면 된다
이때는 slice 함수를 사용하면 끝!!

느낀점
오늘은 그림이 있어서 좀 어려워보였는데 생각보다 풀이가 간단했다
이전 코드카타 때 사용한 sort와 slice를 이용하니까 최대값도 구하기 쉽고 할만했다~~

profile
프론트엔드 개발자

0개의 댓글