알고리즘

JavaScript:: 그래프의 최대 넓이 값 구하기

더 멋진 세상을 꿈꾸는 개발자 2020. 7. 17. 13:18

[JavaScript] 그래프의 최대 넓이 값 구하기

문제

'인자'인 height는 숫자로 이루어진 배열입니다.
그래프로 생각한다면 y축의 값이고, 높이 값을 갖고 있습니다.
아래의 그래프라면 height 배열은 [1, 8, 6, 2, 5, 4, 8, 3, 7] 입니다.

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

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

해결 과정

우리가 해결해야 할 문제는 아래와 같다.

  1. 각 배열의 요소를 돌아가며 다른 배열의 요소의 값과 함께 넓이를 구한다.
  2. 넓이를 구할 때 두 수를 비교하는데, 최소값을 통해 높이 값을 구한다.
  3. 두 요소의 인덱스 값을 비교해 가로값을 구한다.
  4. 모든 경우의 수로 담긴 넓이의 값을 비교하여 큰 수부터 내림차순으로 배열을 정리한다.
  5. 배열 중 가장 큰 수를 반환한다.

해결 과정의 코드는 아래와 같다.

1번 과정

function getMaxArea(height) {
    let value = [];
    for (let i=0; i < height.length; i++) {
        for(let z=height.length-1; z>i; z--) {
          // 이중 for문을 이용해 두 수를 비교할 수 있도록 한다.
        }
    }
}

첫번 째 for문은 배열의 첫자리 수 부터,
두번 쨰 for문은 배열의 뒷자리 수 부터 이동하여
(배열의 뒷자리 수 부터 이동하던, 배열의 앞자리 수 부터 이동하던 상관은 없다)

배열에서 구해질 수 있는 넓이의 모든 경우의 수 값을 구한다.

2, 3번 과정

function getMaxArea(height) {
    let value = [];
    for (let i=0; i < height.length; i++) {
        for(let z=height.length-1; z>i; z--) {
          value.push(Math.min(height[i], height[z]) * (z-i))
        }
    }
}

Math.min(height[i], height[z]) 가 두 수 중의 최소값을 구해 나온 총 넓이의 높이 값이다.

(z - i) 는 두 수의 인덱스 값을 비교하여 넓이의 가로 길이를 구하기 위함이다.

이렇게 구해진 넓이의 세로, 가로 길이를 서로 곱하여 나온 넓이의 값을 value라는 배열에 저장한다.

4번 과정

function getMaxArea(height) {
    let value = [];
    for (let i=0; i < height.length; i++) {
        for(let z=height.length-1; z>i; z--) {
          value.push(Math.min(height[i], height[z]) * (z-i))
        }
    }
    value.sort(function(a,b) {
        return b - a
    })
    console.log(value);
}
getMaxArea([1, 8, 6, 2, 5, 4, 8, 3, 7]);
// [49, 40, 36, 24, 20, 18, 16, 15, 15, 14, 12, 12, 10, 10, 10, 9, 8, 8, 7, 6, 6, 6, 6, 5, 4, 4, 4, 4, 4, 3, 3, 3, 2, 2, 2, 1]

이중 for문을 이용해 구한 각각의 경우의 수들을 담은 value라는 이름을 가진 변수 배열에 sort 함수를 이용하여 각 값들을 큰 수 부터 내림차순으로 정렬한다.

( sort 함수의 매개변수인 a,b는 각각 a는 뒷자리, b는 앞자리이며 음수가 return 될 경우, 각 인자의 위치가 바뀐다.)

5번 과정

function getMaxArea(height) {
    let value = [];
    for (let i=0; i < height.length; i++) {
        for(let z=height.length-1; z>i; z--) {
          value.push(Math.min(height[i], height[z]) * (z-i))
        }
    }
    value.sort(function(a,b) {
        return b - a
    })
    return value.shift();
}
getMaxArea([1, 8, 6, 2, 5, 4, 8, 3, 7]);
// 49

shift 메소드를 이용해 내림차순으로 정의된 value 변수의 배열에서 가장 첫번째 값, 즉 가장 넓이가 큰 값을 반환한다.

문제 해결 완료👏🏻