Zero to Hero
article thumbnail
Published 2021. 6. 30. 22:16
11. Container With Most Water Algorithm
 

Container With Most Water - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

컨테이너 벽의 값이 list로 주어진다.

두 개의 값을 골라서 가장 많은 양의 물을 담을 수 있는 컨테이너의 세로 벽 후보를 고르고, 그때 담을 수 있는 물의 양을 반환하는 문제다.

1. Brute Force

from typing import *


class Solution:
    def maxArea(self, height: List[int]) -> int:
        set1 = set()
        answer = 0
        for i in range(len(height)):
            for j in range(len(height)):
                if i == j:
                    continue
                if (i, j) in set1:
                    continue
                left, right = min(i, j), max(i, j)
                answer = max(answer, (right - left) * min(height[left], height[right]))
                set1.add((left, right))
        return answer

가장 먼저 당연하게도 두 개의 벽의 조합에 대해 모두 계산해보고 비교하는 방법을 생각할 수 있다.

당연히 TLE가 났다.

 

2. Sliding Window

from typing import *


class Solution:
    def maxArea(self, height: List[int]) -> int:
        left, right = 0, len(height) - 1
        answer = 0
        while left < right:
            gap = right - left
            length = min(height[left], height[right])
            answer = max(answer, gap * length)
            if length == height[left]:
                left += 1
            else:
                right -= 1
        return answer

이게 왜 Sliding Window가 될까라고 생각을 해봤는데 이 접근이 어떻게 보면 Greedy 하기 때문에 이 부분에서 떠올리지 못하면 생각을 못할 것 같다.

 

물의 양은 두 벽의 거리(가로) * 두 벽 중 짧은 길이(세로)이고 이것이 최대가 되는 경우를 생각하면 된다.

그럼 가로 * 세로가 크면 되는데...

그럼 가로를 가장 길게 잡은 상태에서 가로를 조금씩 줄여가면서 가로길이를 타협하면서 세로 길이를 취하는 방식으로 포인터를 이동시키면 된다.

그러니깐 left, right 포인터 중 더 작은 값을 가지는 포인터를 앞으로 전진시키면 새로운 벽의 조합을 고르게 되고, 이 방식으로 두 포인터가 겹치기 전까지 계산하면 선형 탐색으로 문제를 해결할 수 있다.

 

 

'Algorithm' 카테고리의 다른 글

73. Set Matrix Zeroes  (0) 2021.07.05
128. Longest Consecutive Sequence  (0) 2021.07.01
96. Unique Binary Search Trees  (0) 2021.06.27
380. Insert Delete GetRandom O(1)  (0) 2021.06.26
116. Populating Next Right Pointers in Each Node  (0) 2021.06.24
profile

Zero to Hero

@Doljae

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!