티스토리 뷰

오늘은 11번을 풀어보겠습니다. 
중간 난이도고 53.9%의 성공률을 보입니다.

ㄱㄱ

길이가 n인 height 정수 배열이 제공됩니다.
i번째 선의 두 점이 (i, 0) 그리고 (i, height[i])처럼 n개의 수직선이 그려집니다.
컨테이너에 가장 많은 물이 포함될 수 있는 x축인 두 개의 선을 찾으세요.
컨테이너가 저장할 수 있는 최대 물의 양을 리턴해야합니다.
컨테이너를 기울이는 건 안된다고 합니다.

주어진 예시를 보겠습니다.

[1,8,6,2,5,4,8,3,7] 9개의 높이를 받았고
인덱스에 맞게 높이를 그려주면 위 이미지와 같습니다.
컨테이너가 저장할 수 있는 최대 물의 양을 리턴해야 하니 컨테이너가 클수록 좋습니다.
해당 예제에서는 1번째 인덱스 8 그리고 8번째 인덱스 7에서 직선을 만들었을 때가 가장 넓은 컨테이너가 되겠죠!
넓이 7 높이 7 (7 * 7 = 49)으로  49가 리턴되면 됩니다.

 

투 포인터를 사용해서 풀어보겠습니다.

func maxArea(_ height: [Int]) -> Int {
    guard height.count > 1 else { return -1 }
    
    var left = 0
    var right = height.count - 1
    var answer = 0
    
    while left < right {
        let minHeight = min(height[left], height[right])
        let current = minHeight * (right - left)
        answer = max(answer, current)
        
        if height[left] < height[right] {
            left = left + 1
        } else {
            right = right - 1
        }
    }
    
    return answer 
}

적어도 두 개의 높이가 주어져야 컨테이너를 형성할 수 있기 때문에 guard로 height.count > 1의 제약을 걸어두었습니다.
(없어도 상관없음)

left, right변수를 선언해 가장 끝 인덱스 값을 할당해줍니다.
answer은 정답을 위한 변수입니다.

while문을 통해 left < right 제약을 둡니다. 
높이가 작은 쪽이 컨테이너의 높이가 되기 때문에 height[left], height[right]를 비교해 작은 값을 minHeight에 넣어줍니다.
현재 컨테이너의 넓이를 구해줍니다. (컨테이너의 넓이 = 가로 * 세로)
컨테이너가 저장할 수 있는 최대 물의 양을 구해야 하기 때문에 max로 현재 answer에 든 값과 current 현재 컨테이너의 넓이를 비교해 더 큰 값을 answer에 저장해줍니다.

height[left]와 height[right]를 비교해 height[left]이 더 작으면 왼쪽 인덱스를 1 증가시켜주고
height[right]가 더 작으면 오른쪽 인덱스를 1 감소시켜줍니다. 
즉 left는 인덱스 0부터 시작하면서 오른쪽으로 움직이고
right는 인덱스 height.count - 1부터 시작하면서 왼쪽으로 움직여
즉 비교할 범위를 줄이는 방식입니다.
(two pointers algorithm)

이렇게 시간복잡도 O(n) 공간복잡도 O(1)로 문제를 해결할 수 있습니다.

이렇게 했을 때 결과는

나름 메모리 작게 사용했다고 생각했는데 ^^? 다른 사람들은 더 작게 사용했나봅니다.

 

resource
https://leetcode.com/problems/container-with-most-water/

'Tech > Algorithm' 카테고리의 다른 글

LeetCode 알고리즘 Sum of Two Integers  (0) 2022.09.15
LeetCode 알고리즘 Pascal's Triangle  (0) 2022.04.21
트라이(trie) 알고리즘  (0) 2022.03.01
LeetCode알고리즘 Maximum Matrix Sum  (3) 2022.02.13
알고리즘 공간복잡도  (2) 2022.02.11
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함