๐ก ๋ฌธ์
๐ฏ ํ์ด ๊ณผ์
์ ๋ฉ์ด๋ฅผ ์ฐพ๊ธฐ ์ํด์๋ ๋จ์กฐ๊ฐ์ ๊ตฌ๊ฐ์ ์์์ผํฉ๋๋ค.
O(n)
์ ์ด๋ฅผ ์ ์ ์๋ ๋ฐฉ๋ฒ์ด ๋ฌด์์ผ๊น์?
์ด๋ฅผ ์ํด monotonic stack์ ํ์ฉํ ์ ์์ต๋๋ค.
height ์ ์ธ๋ฑ์ค๋ฅผ i ๋ผ๊ณ ํ๊ฒ ์ต๋๋ค.
(a) height[i] ๊ฐ stack top ๋ณด๋ค ์๋ค๋ฉด ๊ทธ๋ฅ push ํฉ๋๋ค.
(b) stack top ๊ฐ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๋ค๋ฉด push ํ๊ธฐ์ ์ stack ์์ height[i] ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๊ฐ์ ๊ฐ์ง๋ ์์๋ค์ ๋ชจ๋ pop ํฉ๋๋ค.
๋ฌผ ์
๋ฉ์ด์ ํฌ๊ธฐ๋ฅผ ์๋ ค๋ฉด ๋์ด * ๋๋น
๋ฅผ ์์์ผํฉ๋๋ค.
๋๋น๋ index ๊ฐ์ผ๋ก ์ฝ๊ฒ ์ ์ ์๊ณ , ๋์ด๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํ ์ ์์ต๋๋ค.
min(height[stack[top-1]], height[i]) - height[stack[top]]
ํ์ํ ๊ฐ๋ค์ ์์์ผ๋, ์ด์ ์ ๊ณผ์ ๋ค์ ๋ฐฐ์ด์ ๋์ ๋๋ฌํ ๋๊น์ง ๋ฐ๋ณตํด์ค๋๋ค.
๐จ๐ป ์ฝ๋
/**
* @param {number[]} heights
* @return {number}
*/
var trap = function(heights) {
let answer = 0
const stack = []
for (let idx = 0; idx < heights.length; idx += 1) {
if (stack.length <= 0 || heights[stack.at(-1)] > heights[idx]) {
stack.push(idx)
continue
}
while (stack.length > 0 && heights[stack.at(-1)] <= heights[idx]) {
const top = stack.at(-1)
stack.pop()
if (stack.length <= 0) {
break
}
const width = idx - stack.at(-1) - 1
const height = Math.min(heights[stack.at(-1)], heights[idx]) - heights[top]
answer += (width * height)
}
stack.push(idx)
}
return answer
};
๋ฐ์ํ
'๐ algorithm > leetcode' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
LeetCode 704 - Binary Search (Easy) (0) | 2023.05.14 |
---|---|
LeetCode 438 - Find All Anagrams in a String (Medium) (0) | 2023.05.14 |
LeetCode 238 - Product of Array Except Self (Medium) (2) | 2023.04.24 |
LeetCode 2390 - Removing Stars From a String (Medium) (0) | 2023.04.24 |
LeetCode 1603 - Design Parking System (Easy) (0) | 2023.04.24 |
๐ฌ ๋๊ธ