https://leetcode.com/problems/trapping-rain-water/
ํ์๊ฐ ์ ๋ ํ๋ฆด๊น ๋ง๊น ํ๋ค๊ฐ, ํ๋ฆฌ์ง ์์์ ...
๊ฒฐ๊ตญ ํด์ค์ ๋ณธ ํ์ด์ด๋ค.
์ผ๋จ, trap์ ๊ณ์ฐํ ๋ 2๊ฐ์ง ์ผ์ด์ค๊ฐ ์๋ ๊ฒ์ผ๋ก ํ์ธํ๋ค.
๋ฌผ์ด ๊ฐํ๋ ๊ตฌ์ญ์ ์ ๋๋ด๋ค๋ ๊ฐ์ ํ์, ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ์ ์ต์๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋ฌผ์ ์์ ๊ณ์ฐํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
๊ทธ๋์ ์์ญ์ ์ ๋๋๊ธฐ๋ง ํ๋ฉด ๊ณ์ฐํ ์ ์์ ๊ฒ ๊ฐ์๋๋ฐ, ๊ทธ ๋ถ๋ถ์์ ๋ญ๊ฐ ์ฝ๋๊ฐ ๊ผฌ์๋์ง ํด๊ฒฐ์ด ์ด๋ ค์ ๋ค.
ํ๋ค๊ฐ ์ค๋ํฌ๊ธฐํ ์ฝ๋๋ฅผ ๊ธฐ๋ก์ฐจ ๊ณต์ ํ๋ค.
class Solution(object):
def trap(self, height):
"""
:type height: List[int]
:rtype: int
"""
limit = height[0]
start = 0
trap = 0
for end in range(1, len(height) - 1):
h = height[end]
if h > limit:
length = min(height[start], height[end])
t = end - 1
while t >= start:
if length > height[t]:
trap += (length - height[t])
print('..', t, trap, length)
t -= 1
# ๋ค์ ๋ชฉ๋ก ์กฐํ
start = end + 1
limit = height[start]
else :
# ๋ค์ ๋์ด๋ก ์ด๋
limit = h
# print(end, trap)
return trap
ํด์ค
https://www.youtube.com/watch?v=ZI2z5pq0TqA
class Solution(object):
def trap(self, height):
"""
:type height: List[int]
:rtype: int
"""
if not height:
return 0
l, r = 0, len(height) - 1
leftMax, rightMax = height[l], height[r]
res = 0
while l < r:
if leftMax < rightMax:
l += 1
leftMax = max(leftMax, height[l])
res += leftMax - height[l]
else:
r -= 1
rightMax = max(rightMax, height[r])
res += rightMax - height[r]
return res
ํด์ค์ ๊ฐ๊ฐ ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ์ minLeft์ maxRight๋ฅผ ๊ณ์ฐํด์, ํฌ์ธํฐ๋ฅผ ์ด๋ํ๋ฉด์ ๊ณ์ฐํ๋ค.
chatgpt ํตํด์ for๋ฌธ์ผ๋ก ๋ฐ๊พธ๋ฉด ๋ค์๊ณผ ๊ฐ์ ํ์ด๋ ๊ฐ๋ฅํ๋ค. ์ฌ์ค์ for๋ฌธ์ ์ฌ์ฉํ i๋ ์๋ฏธ๊ฐ ์๋ค.
left, right = 0, len(height) - 1
leftMax, rightMax = height[left], height[right]
res = 0
for i in range(len(height)):
if leftMax < rightMax:
leftMax = max(leftMax, height[left])
res += leftMax - height[left]
left += 1
else:
rightMax = max(rightMax, height[right])
res += rightMax - height[right]
right -= 1
์๋์ ๊ฐ์ด ์์๋ฅผ ํตํด ์ดํดํ๋ฉด ์ข ๋ ์ฝ๊ฒ ์ดํดํ ์ ์๋ค.
์๋ฌด๋๋ Hard๋์ด๋ ๋ฌธ์ ๋ ์์ง ์ด๋ ค์ด ๊ฒ ๊ฐ๋ค.
๋ค์๋ฒ์ ๋ค์ ์๋ํด๋ด์ผ๊ฒ ๋ค.