[๋ฐฑ์ค/python] 9184๋ฒ : ์ ๋๋ ํจ์ ์คํ
๋ฌธ์
์ฌ๊ท ํธ์ถ๋ง ์๊ฐํ๋ฉด ์ ์ด ๋๋ค! ์๋๊ฐ์?
๋ค์๊ณผ ๊ฐ์ ์ฌ๊ทํจ์ w(a, b, c)๊ฐ ์๋ค.
if a <= 0 or b <= 0 or c <= 0, then w(a, b, c) returns:
1
if a > 20 or b > 20 or c > 20, then w(a, b, c) returns:
w(20, 20, 20)
if a < b and b < c, then w(a, b, c) returns:
w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c)
otherwise it returns:
w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1)
์์ ํจ์๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ๋งค์ฐ ์ฝ๋ค. ํ์ง๋ง, ๊ทธ๋๋ก ๊ตฌํํ๋ฉด ๊ฐ์ ๊ตฌํ๋๋ฐ ๋งค์ฐ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค. (์๋ฅผ ๋ค๋ฉด, a=15, b=15, c=15)
a, b, c๊ฐ ์ฃผ์ด์ก์ ๋, w(a, b, c)๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ ๋ ฅ์ ์ธ ์ ์ a, b, c๋ก ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ํ ์ค์ ํ๋์ฉ ์ฃผ์ด์ง๋ค. ์ ๋ ฅ์ ๋ง์ง๋ง์ -1 -1 -1๋ก ๋ํ๋ด๋ฉฐ, ์ธ ์ ์๊ฐ ๋ชจ๋ -1์ธ ๊ฒฝ์ฐ๋ ์ ๋ ฅ์ ๋ง์ง๋ง์ ์ ์ธํ๋ฉด ์๋ค.
์ถ๋ ฅ
์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง ๊ฐ๊ฐ์ a, b, c์ ๋ํด์, w(a, b, c)๋ฅผ ์ถ๋ ฅํ๋ค.
์ ํ
- -50 ≤ a, b, c ≤ 50
์ ๋ต
answer = []
dp = {}
def w(a, b, c):
abc = str(a) + "/" + str(b) + "/" + str(c)
if abc in dp:
return dp[abc]
if a <= 0 or b <= 0 or c <= 0:
return 1
if a > 20 or b > 20 or c > 20:
return w(20, 20, 20)
if a < b and b < c:
dp[abc] = w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c)
return dp[abc]
else:
dp[abc] = w(a-1, b, c) + w(a-1, b-1, c) + \
w(a-1, b, c-1) - w(a-1, b-1, c-1)
return dp[abc]
while 1:
a, b, c = list(map(int, input().split()))
if a == -1 and b == -1 and c == -1:
break
else:
a = 'w({0}, {1}, {2}) = {3}'.format(a, b, c, w(a, b, c))
answer.append(a)
for a in answer:
print(a)
์ ๋ฌธ์ ๋ ๋์ ๊ณํ๋ฒ(Dynamic Programming)์ ์ ์ดํดํ๊ณ ์๋ค๋ฉด ์ฝ๊ฒ ํ ์ ์๋ค.
dp๋ผ๋ ๋์ ๋๋ฆฌ๋ฅผ ์์ฑํ์ฌ ํ๋ฒ ๊ณ์ฐํ ๊ฐ์ dp์ ์ ์ฅํ๋ค.
๋ฌธ์ ์์์ฒ๋ผ ์ฌ๊ทํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ ๊ณ์ฐ์ด๋ผ๋ ํ ๋๋ง๋ค ๊ณ์ฐํ์ง๋ง
๋์ ๊ณํ๋ฒ์ ์ด์ฉํด dp์ ์ ์ฅํ๋ฉด ์ ์ ๋์จ์ ์๋ ๊ณ์ฐ์ dp์ ์ ์ฅ๋ ๊ฐ์ ๊ฐ์ ธ์ค๊ธฐ๋ง ํ๋ฉด ๋๋ค.
def w(a, b, c):
abc = str(a) + "/" + str(b) + "/" + str(c)
if abc in dp:
return dp[abc]
if a <= 0 or b <= 0 or c <= 0:
return 1
if a > 20 or b > 20 or c > 20:
return w(20, 20, 20)
if a < b and b < c:
dp[abc] = w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c)
return dp[abc]
else:
dp[abc] = w(a-1, b, c) + w(a-1, b-1, c) + \
w(a-1, b, c-1) - w(a-1, b-1, c-1)
return dp[abc]
ํจ์ w(a,b,c)๋ฅผ ์์ฑํ๋ค.
dp ๋์ ๋๋ฆฌ์ ํค๊ฐ ๋ abc๋ฅผ "a๊ฐ/b๊ฐ/c๊ฐ"์ธ ๋ฌธ์์ด๋ก ์ ์ฅํ๋ค.
๋ง์ฝ abc๊ฐ dp์ ์ด๋ฏธ ํค๋ก ์กด์ฌํ๋ค๋ฉด ์ด์ ์ ๊ณ์ฐํด์ ๊ฐ์ ์ ์ฅํด๋จ๋จ ์๋ฏธ์ด๋ฏ๋ก ๊ฐ์ returnํ๋ค.
๊ทธ ์๋์ 3๊ฐ์ if๋ฌธ๊ณผ else๋ฌธ์ ๋ฌธ์ ์์ ์ ์ํ ์กฐ๊ฑด ๊ทธ๋๋ก ์์ฑํ๋ฉด ๋๋ค.
๋์ ํจ์๋ฅผ ์คํํ ๋ dp์ ์ ์ฅํด๊ฐ๋ฉฐ ์คํํด์ผ ๊ฐ์ ๊ณ์ฐ์ ๋ฐ๋ณตํ๋ ์ผ์ด ์๋ค.
๋์ ๊ณํ๋ฒ(Dynamic Programming)์ ๋ํ ์์ธํ ์ค๋ช ์ ์๋์ ํฌ์คํ ์์ ํ์ธ ๊ฐ๋ฅํ๋ค.
'๐์๊ณ ๋ฆฌ์ฆ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค/python] 11399๋ฒ : ATM (0) | 2021.03.18 |
---|---|
[๋ฐฑ์ค/python] 9461๋ฒ : ํ๋๋ฐ ์์ด (0) | 2021.03.16 |
[๋ฐฑ์ค/python] 1436๋ฒ : ์ํ๊ฐ๋ ์ (0) | 2021.03.16 |
[๋ฐฑ์ค/python] 4948๋ฒ : ๋ฒ ๋ฅดํธ๋ ๊ณต์ค (0) | 2021.03.16 |
[๋ฐฑ์ค/python] 1011๋ฒ : Fly me to the Alpha Centauri (0) | 2021.03.16 |