๋ฌธ์ ๋งํฌ : https://leetcode.com/problems/trapping-rain-water/description/
ย
๐ฅ๏ธย ์์ํ๋ฉฐ
์ฒ์ ์ ๊ทผ์ด ์ด๋ ค์ ๋ ๋ฌธ์ ์๋ค.
ย
์ฐ์
height
๋ฐฐ์ด์ ๊ฒ์์ ๋ธ๋ญ์ ๋์ด๊ฐ ์ฃผ์ด์ง๊ณ , ๋น๊ฐ ์์ ์ ์
๋ฉ์ด๊ฐ ์๊ธฐ๋ ์นธ์ด ๋ช ์นธ์ธ์ง ๋ต์ ๋์ถํด์ผ ํ๋ ๋ฌธ์ ๋ค.ย
์๋ง ์ง๊ด์ ์ผ๋ก๋ ์ผ์ชฝ ๋ฒฝ๊ณผ ์ค๋ฅธ์ชฝ ๋ฒฝ ์ค ๋ฎ์ ๋ฒฝ์ ๋์ด๋ก ๋ฐ๋ก ์ ๊ทผํ ์ ์์ง ์๋ ์ถ๋ค.
ย
๊ทธ๋์ ๋ณธ์ธ์ ์ผ์ชฝ ๋ฒฝ์ ์ต๋ ๋์ด๋ฅผ ์ ์ฅํ๋ ๋ฐฐ์ด, ์ค๋ฅธ์ชฝ ๋ฒฝ์ ์ต๋ ๋์ด๋ฅผ ์ ์ฅํ๋ ๋ฐฐ์ด์ ์์ฑํ๋ ์ชฝ์ผ๋ก ๊ฐ๋ฅ์ ์ก์๋ค.
ย
์๋ ๊ทธ๋ฆผ์ ์ค์ฌ์ผ๋ก ํํค์ณ๋ณด์.
๊ฒฐ๊ตญ ์ด๋ฅผ ์์ผ๋ก ํ์ด๋ด์๋ฉด
์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ ๋ฒฝ์ ์ต์๊ฐ
- ๊ฒ์์ ๋ธ๋ก ๋์ด
๋ผ๊ณ ํ ์ ์๋ค.ย
Python
class Solution: def trap(self, height: List[int]) -> int: if not height: return 0 res = 0 H = len(height) leftMax = [0] * H rightMax = [0] * H # ์ผ์ชฝ ์ต๋ ๋์ด ๋ฒฝ ์ ์ฅ leftMax[0] = height[0] for i in range(1, H): leftMax[i] = max(leftMax[i - 1], height[i]) # ์ค๋ฅธ์ชฝ ์ต๋ ๋์ด ๋ฒฝ ์ ์ฅ rightMax[H - 1] = height[H - 1] for i in range(H - 2, -1, -1): rightMax[i] = max(rightMax[i + 1], height[i]) # ๊ณ์ฐ for i in range(H): res += min(leftMax[i], rightMax[i]) - height[i] return res
C++
class Solution { public: int trap(const std::vector<int>& height) { if (height.empty()) { return 0; } int H = height.size(); int res = 0; std::vector<int> leftMax(H); std::vector<int> rightMax(H); // ์ผ์ชฝ์์๋ถํฐ ์ต๋ ๋์ด ์ ์ฅ leftMax[0] = height[0]; for (int i = 1; i < H; ++i) { leftMax[i] = std::max(leftMax[i - 1], height[i]); } // ์ค๋ฅธ์ชฝ์์๋ถํฐ ์ต๋ ๋์ด ์ ์ฅ rightMax[H - 1] = height[H - 1]; for (int i = H - 2; i >= 0; --i) { rightMax[i] = std::max(rightMax[i + 1], height[i]); } // ๋ฌผ์ ์ก์ ์ ์๋ ์ ๊ณ์ฐ for (int i = 0; i < H; ++i) { res += std::min(leftMax[i], rightMax[i]) - height[i]; } return res; } };
ย
ย
์๊ฐ
DP๋ ๋ค๋ฅธ ๋ฐฉ์์ ๋ ์ฌ๋ฆฌ๋ค๊ฐ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ ธ๋ค. ์๊ณ ๋ฆฌ์ฆ ๋ค์ ์ค๋นํ๋๊ฑธ๋ก..
ย
๋ถ๋ก
์ฐธ๊ณ ๋ฌธํ
ย
๋๊ธ