Algorithm - 물을 담을 수 있는 가장 넓은 면적 구하기

rachel's blog·2021년 10월 31일
0

Algorithm

목록 보기
11/11
post-thumbnail

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

🥑 첫번째 풀이

function getMaxArea(height) {

  let area = []; //면적
  let arr = [];

  let max = Math.max(...height);
  let idx = height.indexOf(max);

  arr = [...height.slice(0, idx), ...(height.slice(idx + 1, height.length))]

  let newMax = Math.max(...arr)
  area.push((arr.indexOf(newMax) - idx + 1) * newMax)

  arr = [...arr.slice(0, arr.indexOf(max)), ...(arr.slice(arr.indexOf(max) + 1, arr.length))]
  newMax = Math.max(...arr);
  area.push((arr.indexOf(newMax) - idx + 2) * newMax)

  for (let i = 3; i < height.length; i++) {
    arr = [...arr.slice(0, arr.indexOf(newMax)), ...(arr.slice(arr.indexOf(newMax) + 1, arr.length))]
    newMax = Math.max(...arr);
    area.push((arr.indexOf(newMax) - idx + i) * newMax)
  }
  return Math.max(...area)
}
  1. 접근 방식 : height배열 중 가장 큰 Max값으로 접근해서 height의 길이까지의 인덱스를 width값으로 하여 각 인덱스마다 Max값을 전부 곱해줘서 area에 push한다.
  2. push하고 난 Max값은 원본배열은 살려두고 slice로 잘라서 다시 잘려진 배열에서의 최대값을 구해서 각 인덱스 길이 마다 Max값을 곱해서 area push하는 작업을 반복해서 하는 것이다.

결과 : testcase 50%만 통과

💡 오류 발생원인 파악해보기

  • 최대값을 순차적으로 구함으로써 최대값이 겹치는 오류는 없앴으나, 해당 최대값이 어느 인덱스에 위치해 있느냐에 따라 면적 값이 다른데, 그에 대한 고려가 부족했다.

🥑 두번째 풀이

  let area=[];
  for(let i=0; i<height.length; i++){
    for(let j=1; j<height.length; j++){
      if(height[i]>=height[j]){
        area.push(Math.abs(j-i) * height[j])
      }else {
        area.push(Math.abs(j-i)*height[i])
      }
    }
  }
  const res = [...new Set(area)];
    return Math.max(...res)

간단하게 생각해보기로 했다.
가로 너비는 인덱스의 차이이고, height[인덱스]를 비교해서 더 작은 값을 세로 높이로 결정해주면 된다.
그리고, area에 계속해서 넓이 값을 push해 주면 된다. Math.abs를 사용한 건 (j-i)가 음수일 경우를 없애기 위해서 사용했고, 이 반복을 돌리는 과정에서 중복값이 발생해서 set으로 중복값까지 삭제가 완료된 상태에서 area의 최대값을 구했다.

profile
블로그 이전 : https://rachelslab.tistory.com/

0개의 댓글