[leetcode] 11. Container With Most Water

2025. 5. 7. 22:57·알고리즘

 

 

이문제를 처음 접했을때는 가로는 가장 넓은 거를 기준으로 잡고

높이는 가장 높은거로 하면되겠다 이렇게 막연한 생각만 들었었다.

 

벽으로 문제를 푼다고 상상해보자

height = [1, 8, 6, 2, 5, 4, 8, 3, 7]

벽이 여러개 세워져 있는 모양으로 각 숫자는 벽의 높이고, 벽 사이에 물을 채울 수 있다.

 

첫번째 개념 : 어떤 두변 사이에 물을 담을 수 있다.

예를 들어 왼쪽 벽 높이가 8, 오른쪽 벽이 6이면 아무리 왼쪽이 높아도 낮은 벽 높이만큼 물을 담을수있다.

즉, 물의 높이는 두벽중 작은 높이

 

두번째 개념 : 너비도 중요하다

벽 사이의 거리가 멀수록, 물을 더 많이 담을 수 있다.

즉, 물의 양은 (작은 높이) x (두 벽 사이의 거리)

 

전략: 최대 물을 담기위해 두 끝에서 시작한다

  1. 처음앤 맨 왼쪽과 맨 오른쪽에서 시작한다 → 이렇게하면 일단 너비는 최대
  2. 두벽 사이의 물의 양을 계산 → 작은쪽 높이를 기준으로 x 거리
  3. 그다음 더 낮은 쪽의 벽을 한칸 안으로 이동한다
  4. 이걸 계속 반복하면서 최대값을 업데이트한다

 

첫번째 결과물

var maxArea = function (height) {
  let left = 0;
  let right = height.length - 1;
  let maxNum = 0;
  let tempWidth = 0;

  while (left < right) {
    const width = right - left; // 거리
    if (height[left] > height[right]) {
      tempWidth = width * height[right];
    } else {
      tempWidth = width * height[left];
    }

    if (maxNum < tempWidth) {
      maxNum = tempWidth;
    }

    left++;
  }
  return maxNum;
};

Math.min 으로 비교값 간단화하기

/**
 * @param {number[]} height
 * @return {number}
 */
var maxArea = function (height: Array<number>) {
  let left = 0;
  let right = height.length - 1;
  let maxNum = 0;
  let tempWidth = 0;

  while (left < right) {
    const width = right - left; // 거리

    tempWidth = width * Math.min(height[left], height[right]); // -------------------> 변경
    if (maxNum < tempWidth) {
      maxNum = tempWidth;
    }

    left++;
  }
  return maxNum;
};

console.log(maxArea([1, 8, 6, 2, 5, 4, 8, 3, 7]));

변수명 바꾸기

최대면적 , 최소면적으로 보기쉽게 mexNum, tempWidth에서 area, maxArea로 바꿨다

/**
 * @param {number[]} height
 * @return {number}
 */
var maxArea = function (height: Array<number>) {
  let left = 0;
  let right = height.length - 1;
  let maxArea = 0; // -------------------> 변경
  let area = 0; // -------------------> 변경

  while (left < right) {
    const width = right - left; // 거리

    area = width * Math.min(height[left], height[right]);
    maxArea = Math.max(area, maxArea);

    left++;
  }
  return maxArea;
};

console.log(maxArea([1, 8, 6, 2, 5, 4, 8, 3, 7]));

(추가)두개 포인터 값비교후 작은값이 이동

/**
 * @param {number[]} height
 * @return {number}
 */
var maxArea = function (height: Array<number>) {
  let left = 0;
  let right = height.length - 1;
  let maxArea = 0;
  let area = 0;

  while (left < right) {
    const width = right - left; // 거리

    area = width * Math.min(height[left], height[right]);
    maxArea = Math.max(area, maxArea);

    if (height[left] < height[right]) {. // -------------------> 변경
      // 더 낮은 벽을 이동해야 더큰 면적기대
      left++;
    } else {
      right--;
    } 
  }
  return maxArea;
};

console.log(maxArea([1, 8, 6, 2, 5, 4, 8, 3, 7]));

 

'알고리즘' 카테고리의 다른 글

[leetcode] 2623. Memoize  (0) 2025.04.07
[알고리즘] Linked List 이란  (0) 2024.11.10
[알고리즘] 배열중간삽입 - Linked List를 알기위한 사전단계  (0) 2024.11.10
[알고리즘] 피보나치 수열 - dp를 알기위한 사전단계  (3) 2024.11.09
[알고리즘] Hash (해쉬)이란  (0) 2024.02.12
'알고리즘' 카테고리의 다른 글
  • [leetcode] 2623. Memoize
  • [알고리즘] Linked List 이란
  • [알고리즘] 배열중간삽입 - Linked List를 알기위한 사전단계
  • [알고리즘] 피보나치 수열 - dp를 알기위한 사전단계
윤랩용
윤랩용
잘, 자연스럽게, 기분좋게
  • 윤랩용
    yunrap 개발블로그
    윤랩용
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 네트워크
        • HTTP
      • 언어
        • Html
        • CSS
        • JAVASCRIPT
        • JAVA
        • 개발용어
        • 코딩테스트
      • 알고리즘
      • 강의
      • BOOK
        • 모던 자바스크립트 Deep Dive
        • 인사이드 자바스크립트
      • Backend
        • 기능구현
        • Spring
      • FrontEnd
        • React
        • Javascript
        • CSS
        • [사이트프로젝트] 인스타 clone
        • 기능구현
      • 자기개발
      • 업무 TIL
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    promise catch
    클로저 js
    __proto__
    캡슐화
    create react app
    콜백패턴
    빌트인객체 프로미스
    물너비구현하기
    프로미스체이닝
    즉시실행함수
    원시타입
    시스템테마
    접근자프로퍼티
    클로저
    dark:
    함수프로그래밍
    비동기요
    var키워드
    tailwind 다크모드
    후속처리메서드
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
윤랩용
[leetcode] 11. Container With Most Water
상단으로

티스토리툴바