CodeKataJavaSc1 / Week 2 - Day 5
문제
문제
인자인 height는 숫자로 이루어진 배열입니다. 그래프로 생각한다면 y축의 값이고, 높이 값을 갖고 있습니다.
아래의 그래프라면 height 배열은 [1, 8, 6, 2, 5, 4, 8, 3, 7] 입니다.
저 그래프에 물을 담는다고 생각하고, 물을 담을 수 있는 가장 넓은 면적의 값을 반환해주세요.
가정
배열의 길이는 2이상입니다.
https://storage.googleapis.com/replit/images/1555380144403_97221ca23fbb92beaae5b6c800ceb5c8.pn
Console
Shell
Markdown
내 풀이
function getMaxArea(height) {
let max = 0;
for(let i = 0 ; i <height.length-1 ;i++){
for(let j=i+1 ; j < height.length ; j++){
//let min = Math.min(height[i],height[j])
if(height[i]<=height[j]){
max = Math.max(max,(j-i)*(height[i]))
} else {
max = Math.max(max,(j-i)*(height[j]))
}
}
}
return max;
}
간만에 쉬운 문제가 나왔다.
가로 * 세로를 곱하되 ,
가로는 인덱스끼리 뺀값, 세로는 첫번째 배열 요소와 두번째 배열 요소 중 작은 값을 쓰면 된다.
그리고 중복된 값끼리의 가로 세로를 만드는 것을 방지하기위해 두번째 배열의 인덱스는 i+1 로 시작한다.
이렇게 하면 가로는 무조건 양수가 나와 절대값 처리를 해 줄 필요가 없다 .
그런데 생긴 의문
두 배열 요소 중 작은 값을 선택할때 ,
let min = Math.min((height[i],height[j]))
로 작은 값을 찾고 ,
max = Math.max(max,(j-i)*min)
로 최대면적을 구하면 왜 잘못된 답이 나올까?
다시 보니 괄호를 두번 묶었는데,,, 한 번 묶어야함
이유는 모르겠지만 math.min의 인자에 괄호를 한번 더 넣으면 인자 중 최대값이 나온다.
하지만 math.max() 의 인자의 경우에는 그대로 최대값이 출력됨
즉 ,
function getMaxArea(height) {
let max = 0;
for(let i = 0 ; i <height.length-1 ;i++){
for(let j=i+1 ; j < height.length ; j++){
let min = Math.min(height[i],height[j])
max = Math.max(max,(j-i)*min)
}
}
return max;
}
이렇게 하면 된다.
Author And Source
이 문제에 관하여(CodeKataJavaSc1 / Week 2 - Day 5), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@gloriousmin77/CodeKataJavaSc1Week-2-Day-5저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)