CodeKata. 가장 큰 면적 값 반환

ha ju·2021년 5월 8일
0
post-thumbnail

🧐 문제

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

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

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

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

🧐 나의 코드

const height= [1, 8, 6, 2, 5, 4, 8, 3, 7]
function getMaxArea(height) {
  let size = 0;
  for (let i = 0; i<height.length; i++) {
    for(let j= i+1; j<height.length; j++) {
      const waterSize = (Math.min(height[i], height[j]) * (j-i) );
      if(size < waterSize) {
        size = waterSize
      };
    }
  }
return size;
}
getMaxArea(height) 

💡 접근 방법

처음에는 그래프로 문제를 이해하려해서 문제의 본질을 보기에 더 어려웠다.
이 문제의 배열의 요소들 중 2개의 값을 설정하고, 기준이 되는 값와 나머지 값 사이의 면적이 가장 큰 값을 반환하면 되는 것이다.

  • 우선 기준 값, 나머지 값을 차례로 꺼내야하기 때문에 각각 i와 j로 설정하여 이중 for문을 돌려주었다.
  for (let i = 0; i<height.length; i++) {
    for(let j= i+1; j<height.length; j++) {
       }
    }
  • 기준값과 나머지 값 사이의 면적에 대한 식을 세워 변수에 넣어주었다.
const waterSize = (Math.min(height[i], height[j]) * (j-i) );

- height : Math.min(height[i], height[j])
- width : (j-i)
=> 면적 = (Math.min(height[i], height[j]) * (j-i))
두 값 중 작은 값(물이 담기려면 가장 작은값까지 담기기 때문에

  • for문 밖에서 size=0이라는 변수 설정
    - i와 j에 따른 면적이 초기 설정한 size 값보다 크면 해당 값을 size에 넣어주면서 최종적으로 최대 면적을 구해주기 위해
  • i값과 j값이 설정되었을 때 면적을 계산하고, size < largeSize일 때 밖의 변수인 size를 largeSize로 바꿔주어 최종적으로 가장 큰 면적이 largesize로 반환되도록 if문 적용
const waterSize = (Math.min(height[i], height[j]) * (j-i) );
      if(size < waterSize) {
        size = waterSize
      };

💡 활용 문법

최소 최대값 반환
Math.min( )주어진 숫자들 중 가장 작은 값 반환
Math.max( )주어진 숫자들 중 가장 큰 값 반환
  • Math.min([value1[, value2[, ...]]])
    • value1, value2, ... 파라미터는 숫자형이다

0개의 댓글