ํฐ์คํ ๋ฆฌ ๋ทฐ
๋ฐฑ์ค 1912๋ฒ ๋์ ํฉ [DP][Python]
10000COW 2023. 1. 14. 23:18๋ฌธ์
n๊ฐ์ ์ ์๋ก ์ด๋ฃจ์ด์ง ์์์ ์์ด์ด ์ฃผ์ด์ง๋ค. ์ฐ๋ฆฌ๋ ์ด ์ค ์ฐ์๋ ๋ช ๊ฐ์ ์๋ฅผ ์ ํํด์ ๊ตฌํ ์ ์๋ ํฉ ์ค ๊ฐ์ฅ ํฐ ํฉ์ ๊ตฌํ๋ ค๊ณ ํ๋ค. ๋จ, ์๋ ํ ๊ฐ ์ด์ ์ ํํด์ผ ํ๋ค.
์๋ฅผ ๋ค์ด์ 10, -4, 3, 1, 5, 6, -35, 12, 21, -1 ์ด๋ผ๋ ์์ด์ด ์ฃผ์ด์ก๋ค๊ณ ํ์. ์ฌ๊ธฐ์ ์ ๋ต์ 12+21์ธ 33์ด ์ ๋ต์ด ๋๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ ์ n(1 ≤ n ≤ 100,000)์ด ์ฃผ์ด์ง๊ณ ๋์งธ ์ค์๋ n๊ฐ์ ์ ์๋ก ์ด๋ฃจ์ด์ง ์์ด์ด ์ฃผ์ด์ง๋ค. ์๋ -1,000๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 1,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ ์์ด๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ๋ต์ ์ถ๋ ฅํ๋ค.
์์ 1
10
10 -4 3 1 5 6 -35 12 21 -1
์ถ๋ ฅ: 33
์์ 2
10
2 1 -4 3 4 -4 6 5 -5 1
์ถ๋ ฅ: 14
๋ฌธ์ ์ ํ
DP
๋ฌธ์ ํ์ด
๋ฏธ๋ฆฌ ์ดํด๋ณด๋ ํต์ฌ ํฌ์ธํธ โ
i ๋ฒ์งธ ๋ฐ์ดํฐ๊น์ง์ ์ต๋ ์ฐ์ํฉ์ ๊ธฐ๋กํ๋ค. sums[i-1]
์ด ๊ธฐ๋กํ ๊ฒ์ ๋ค์ i ๋ฒ์งธ ๋ฐ์ดํฐ์์ ์ด์ฉํด i ๋ฒ์งธ ๋ฐ์ดํฐ๊น์ง์ ์ต๋ ์ฐ์ํฉ์ ๊ตฌํ๋ค.
nums[i]๋ ์ฃผ์ด์ง ๋ฐฐ์ด,
sums[i]๋ i๋ฒ์งธ ์ธ๋ฑ์ค๊น์ง ์ต๋ ์ฐ์ํฉ์ด ๋ด๊ธด ๋ฐฐ์ด์ด๋ค.
i ๋ฒ์งธ ์ด์ ๊น์ง์ ์ต๋ ์ฐ์ํฉ(sums[i-1])์ i ๋ฒ์งธ ๋ฐ์ดํฐ ๊ฐ(nums[i]) ์ ๋ํด๋๊ฐ๋ค.
๋จ, ์ด์ ๊น์ง์ ์ต๋ ์ฐ์ํฉ(sums[i-1])์ด 0๋ณด๋ค ์์ผ๋ฉด ์ด์ ๊น์ง์ ๋์ ํฉ์ ๋ฒ๋ฆฌ๊ณ โก๏ธ i ๋ฒ์งธ ๋ฐ์ดํฐ ๊ฐ(nums[i])์ ์ต๋ ์ฐ์ํฉ์ผ๋ก ์๋ก ์์ํ๋ค.
์๋ํ๋ฉด ์ด์ ๊น์ง์ ์ต๋ ์ฐ์ํฉ๊ณผ ์์ ์ ๋ํ ๊ฒ๋ณด๋ค, ์๊ธฐ ์์ (nums[i])์ด ๋ ํฌ๊ธฐ ๋๋ฌธ์ด๋ค. nums[i] > sums[i-1] + nums[i]
sums[i] = nums[i] + (sums[i-1] if sums[i-1] > 0 else 0)
# ๋๋
sums[i] = max(sums[i-1] + nums[i], nums[i])
ํ๋ ํ๋ ํด๋ณด๊ธฐ
๐ฆ index=0์ผ ๋, ํ์ฌ ์์น ๊ธฐ์ค ์ต๋ ์ฐ์ํฉ์ ์๊ธฐ ์์ sums[0] = 10
๐ฆ index=1์ผ ๋, ํ์ฌ ์์น ๊ธฐ์ค ์ต๋ ์ฐ์ํฉ์ sums[i-1] + nums[i] = 10 + (-12) = -2 โก๏ธ sums[1] = -2
๐ฆ index=2์ผ ๋, ์ด์ ๊น์ง์ ์ฐ์ ์ต๋ํฉ์ด 0๋ณด๋ค ์์ผ๋ฏ๋ก, nums[2] > sums[1] + nums[2] โก๏ธ sums[2] = 30
๐ฆ index=3์ผ ๋, ํ์ฌ ์์น ๊ธฐ์ค ์ต๋ ์ฐ์ํฉ์ sums[i-1] + nums[i] = 30+(-8) โก๏ธ sums[3] = 22
์ฆ, ํ์ฌ ์์น ๊ธฐ์ค ์ต๋ ์ฐ์ํฉ์ ์ด์ ์ฐ์ํฉ๊ณผ ๋ํ๊ฑฐ๋ ๋ํ์ง ์๊ฑฐ๋ 2๊ฐ์ง ์ค ํ ๊ฐ์ง๊ฐ ๋๋ค.
์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ํ์์ ๋ง๋ค ์ ์์ผ๋ฉฐ,
๊ฐ ๋ถ๋ถ์์ ์ด์ ์ ๊ฒฐ๊ณผ๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉ๋๊ณ ํด๋น ์ต์ ๊ฒฐ๊ณผ๊ฐ์ด ๊ทธ๋๋ก ์ฌ์ฉ๋๋
DP์ ๋ ๊ฐ์ง ์กฐ๊ฑด์ธ Overlapping Subproblems์ Optimal Substructure๋ฅผ ๋ง์กฑํ๋ค.
DP ์ฌ์ฉํ๊ธฐ
1๏ธโฃ DP๋ก ํ ์ ์๋ ๋ฌธ์ ์ธ์ง ํ์ธํ๊ธฐ
๐ฝ
2๏ธโฃ ๋ฌธ์ ์ ๋ณ์ ํ์ ํ๊ธฐ
์ ์
: sums[i] = ์์น i์์์ ์ฐ์ํฉ์ ์ต๋๊ฐ
๐ฝ
3๏ธโฃ ์ ํ์ ๋ง๋ค๊ธฐ
์ ํ์
sums[i] = nums[i] + (sums[i-1] if sums[i-1] > 0 else 0 )
๋๋
sums[i] = max(sums[i-1] + arr[i], arr[i])
๐ฝ
4๏ธโฃ ๋ฉ๋ชจํ๊ธฐ(Memoization)
sums ๋ฐฐ์ด์ ๋ฉ๋ชจ๋๊ณ ์๋ค.
๐ฝ
5๏ธโฃ ๊ธฐ์ ์ํ ํ์ ํ๊ธฐ
๊ธฐ์ ์ํ๋ ์ฒซ๋ฒ์งธ ์ฐ์ํฉ์ ๊ฒฐ๊ณผ๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒฝ์ฐ์ผ ๊ฒ์ด๋ค. ์ ์ผ ์ฒ์์ ๋จ์ํ ๊ทธ ์์น์ ์ ๋ฐฐ์ด์ ์ซ์๊ฐ ๋๋ค.
๊ธฐ์ ์ํ
: DP[0] = arr[0]
๐ฝ
6๏ธโฃ ๊ตฌํํ๊ธฐ
1) Bottom-Up (Tabulation ๋ฐฉ์) - ๋ฐ๋ณต๋ฌธ ์ฌ์ฉ โ
2) Top-Down (Memoization ๋ฐฉ์) - ์ฌ๊ท ์ฌ์ฉ
์ ์ฒด ์ฝ๋
๊ธฐ์กด nums์ ์ต๋ ์ฐ์ํฉ์ ํจ๊ป ๋ฃ์ด ๊ณต๊ฐ์ ์ฌํ์ฉํ ์๋ ์๋ค. (๊ณต๊ฐ ๋ณต์ก๋ ๐ฝ)
๊ฐ์ ์๋ฆฌ์ธ ์๋์ ์ ํ์์ผ๋ก๋ ํ์ด๊ฐ ๊ฐ๋ฅํ๋ค.
์ฐธ๊ณ ์ถ์ฒ: [์๊ณ ๋ฆฌ์ฆ ํ์ด - ๋ฐฑ์ค 1912(์ฐ์ํฉ, DP) https://hongjw1938.tistory.com/61
'๐ง๐ปโ๐ป ์ฝ๋ฉํ ์คํธ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Greedy] 2212 ์ผ์(Python) (0) | 2023.02.20 |
---|---|
๋ฐฑ์ค 1966๋ฒ ํ๋ฆฐํฐํ [์๋ฎฌ๋ ์ด์ ][Python] (1) | 2023.01.17 |
ํ ์ด๋ ์ดํดํ๋ ๋ฐฑ์ค 9251๋ฒ LCS [DP][Python] (1) | 2023.01.15 |
๋ฐฑ์ค 15624๋ฒ ํผ๋ณด๋์น ์ 7 [Python / JavaScript] (0) | 2023.01.09 |
- Total
- Today
- Yesterday
- error
- DB
- React Query
- ์๋ฃ๊ตฌ์กฐ
- Python
- ๊ทธ๋ํ
- git
- ์ ๋ ฌ
- ๋ธ๋ผ์ฐ์
- mdn
- CSS
- zustand
- DOM
- ํ์ด์ฌ
- ์๊ณ ๋ฆฌ์ฆ
- state
- BOJ
- react
- Context API
- github
- Component
- JavaScript
- ํจ์
- ์๋ฐ์คํฌ๋ฆฝํธ
- ์๋ฌ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
- useState
- leetcode
- Browser
- ๋ฆฌ์กํธ
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 | 31 |