안녕하세요, HELLO
오늘은 Leetcode 알고리즘 문제 '11. Container With Most Water'에 대해서 살펴보고자 합니다.
알고리즘 문제, 코드, 해설 그리고 Leetcode에서 제공해준 solution 순서대로 정리하였습니다.
STEP 1. 'Container With Most Water' 알고리즘 문제
STEP 2. 'Container With Most Water' 코드(code)
STEP 3. 'Container With Most Water' 해설
STEP 4. 'Container With Most Water' solution
STEP 1. 'Container With Most Water' 알고리즘 문제
You are given an integer array height of length n. There are n vertical lines drawn such that the two endpoints of the ith line are (i, 0) and (i, height[i]).
Find two lines that together with the x-axis form a container, such that the container contains the most water.
Return the maximum amount of water a container can store.
Notice that you may not slant the container.
길이 n의 정수 배열 높이가 지정됩니다. x축과 함께 용기를 형성하여 용기에 물이 가장 많이 포함되도록 하는 두 개의 선을 찾습니다. 용기에 저장할 수 있는 최대 양의 물, 연산을 구합니다.
Constraints:
- n == height.length
- 2 <= n <= 105
- 0 <= height[i] <= 104
STEP 2. 'Container With Most Water' 코드(code)
■ Runtime: N/A
■ Memory Usage: N/A
접근 방식은 height에서 내림차순으로 정렬한 list를 새롭게 만들어서, 가장 큰 height를 하나씩 제거하면서 연산을 진행했습니다. 다만, 이중 반복문을 활용해서 while - for을 통해 연산 속도가 너무 느려서 "Time Limit Exceeded"가 나왔습니다.
class Solution:
def maxArea(self, height: List[int]) -> int:
number_lst = sorted(height, reverse = True)
check_prev = 0
width_lst = []
while len(number_lst) != 0 :
max_height = max(number_lst)
# check max_height
for i in range(len(height)):
if height[i] == max_height:
width_lst.append(i)
while max_height in number_lst:
number_lst.remove(max_height)
width = max(width_lst) - min(width_lst)
tall = max_height
check = width * tall
answer = check_prev if check_prev > check else check
check_prev = answer
return answer
그래서 이를 개선하기 위해, Two pointer python solution을 활용한 코드를 확인했습니다.
■ Runtime: 1544 ms, faster than 5.17% of Python3 online submissions for Container With Most Water.
■ Memory Usage: 27.2 MB, less than 95.20% of Python3 online submissions for Container With Most Water.
class Solution:
def maxArea(self, height: List[int]) -> int:
l = 0
r = len(height) -1
width = len(height) -1
maxi = 0
while l < r:
area = min(height[l], height[r]) * width
maxi = max(maxi, area)
if height[l] < height[r]:
l+=1
else:
r-=1
width -=1
return maxi
STEP 3. 'Container With Most Water' 해설
위에 작성된 코드의 주석을 아래처럼 달아봤습니다.
class Solution:
def maxArea(self, height: List[int]) -> int:
'''
알고리즘 접근 방식은 처음부터 진행되는 순방향과 마지막부터 진행되는 역방향, 2개를 활용해서
연산을 통해 가장 높은 넓이를 구하는 것입니다.
'''
l = 0 # 순방향 시작점
r = len(height) - 1 # 역방향 시작점
width = len(height) -1 # 초기 가로값
maxi = 0 # 초기 넓이값
while l < r:
area = min(height[l], height[r]) * width # 넓이
maxi = max(maxi, area) # 두 값 중에서
# 순방향과 역방향을 비교하여, 작은 쪽이 한 칸씩 이동하는 방향
if height[l] < height[r]:
l += 1
else:
r -= 1
return maxi
STEP 4. 'Container With Most Water' solution
추가적으로, Leetcode에서 제공해준 solution 코드를 살펴보겠습니다.
■ Runtime: 752 ms, faster than 91.90% of Python3 online submissions for Container With Most Water.
■ Memory Usage: 27.4 MB, less than 89.24% of Python3 online submissions for Container With Most Water.
class Solution:
def maxArea(self, height: List[int]) -> int:
water = 0
head = 0
tail = len(height) - 1
for cnt in range(len(height)):
width = abs(head - tail)
if height[head] < height[tail]:
res = width * height[head]
head += 1
else:
res = width * height[tail]
tail -= 1
if res > water:
water = res
return water
■ 마무리
오늘은 Leetcode 알고리즘 문제 '11. Container With Most Water'에 대해서 알아봤습니다.
좋아요와 댓글 부탁드리며,
오늘 하루도 즐거운 날 되시길 기도하겠습니다 :)
감사합니다.
'PROGRAMMING > LeetCode' 카테고리의 다른 글
[Leetcode] 13. Roman to Integer_해설, 풀이, 설명 (0) | 2022.05.01 |
---|---|
[Leetcode] 12. Integer to Roman_해설, 풀이, 설명 (0) | 2022.04.30 |
[Leetcode] 10. Regular Expression Matching_해설, 풀이, 설명 (0) | 2022.04.18 |
[Leetcode] 9. Palindrome Number_해설, 풀이, 설명 (0) | 2022.04.18 |
[Leetcode] 8. String to Integer (atoi)_해설, 풀이, 설명 (0) | 2022.04.06 |
댓글