210827 그래프에 물 담기??

박은정·2021년 8월 27일
0

문제

인자인 height는 숫자로 이루어진 배열입니다.
그래프로 생각한다면 y축의 값이고, 높이 값을 갖고 있습니다.

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

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

가정

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

문제이해

  1. 물을 담을 수 있는 가장 넓은 면적 size는 결국 물을 담은 파란색 부분을 구하는 것이다
    따라서 size를 구하는 공식? = 두 요소 간의 가로길이 * 높이가 낮은 요소의 y축길이

  2. getMaxArea() 함수에 받을 인자로는 배열이기 때문에 for문을 이용할건데
    1번에서 이해한 내용을 보면 2개의 요소를 비교해야 하기 때문에 2개의 for문을 사용할 것이다

  3. 다만 두 요소가 중복되면 안되기도 하면서 & 두 요소 간의 가로길이 차이 (=인덱스 차이) 를 구하기 위해서는
    각각의 인덱스 값이 달라야 하기 때문에 (=하나는 크고, 다른 하나는 작고) i < j
    → 첫번째 for문과 두번째 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;
}

코드설명

  1. 물을 담을 파란색 부분의 넓이 값을 넣어줄 변수 size 선언 (초기값은 0)
let size = 0;
  1. 두개의 for문 실행, 두번째 for문은 시작조건이 j=i+1
for (let i = 0; i < height.length; i++) {
  for (let j = i + 1; j < height.length; j++) {
  }
}
  1. 물이 담길 부분의 넓이 = (두 요소 간의 인덱스 차이) X (가장 작은 요소값)
    → 요소 자체가 그래프의 높이이기 때문이다
  • 두 요소 간의 인덱스 차이
(j - i)
  • 두 요소 중 작은 값
Math.min(height[i], height[j])
  • size 구하는 값
Math.min(height[i], height[j]) * (j - i)
  1. for문을 이용해 요소의 처음부터 끝까지 각각의 size를 구하고 그 중 최대 값을 구한다
size = Math.max(Math.min(height[i], height[j]) * (j - i), size);
profile
새로운 것을 도전하고 노력한다

0개의 댓글