2021. 7. 31. 11:38ใPython
https://www.acmicpc.net/problem/2011
2011๋ฒ์ Dynamic Programming ๋ฌธ์ ์ ๋๋ค.
DP ๋ฌธ์ ๋ ํ ๋ฒ ์๊ฐ์ด ์ ๋๋ฉด ์๋ฌด๋ฆฌ ์์ ๊ธธ๊ฒ ์ฐ๋ฉด์ ๋ ธ๊ฐ๋ค๋ฅผ ํด๋ณด๊ณ ๊ท์น์ ์ฐพ์ผ๋ ค๊ณ ํด๋ ์๋ชป ์ฐพ๊ฒ ๋๊ฑฐ๋, ์์ ๋ชป ์ฐพ๊ฒ ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ ๊ฒ ๊ฐ์ต๋๋ค(๋ฌผ๋ก ์ ํ์ ). DP ๋ฌธ์ ๋ฅผ ๋ ํ์ด๋ณด๊ณ , ์์ ์ ํ์๋ ๊ฒ๋ค๋ ๋ค์ ํ์ด๋ณด๋ฉด ๋ฐ์ดํฐ๊ฐ ์์ด๋ฉด์ ์ข ๋ ๋น ๋ฅด๊ฒ ๊ท์น์ ์ฐพ๊ณ ์์ ์ฐพ์ ์ ์์ ๊ฒ ๊ฐ์ง๋ง, ์์ง์ ๊ทธ๋ฐ ๊ฒฝ์ง์๋ ๋ค๋ค๋ฅด์ง ๋ชปํ ๊ฒ ๊ฐ์ต๋๋ค.
2011๋ฒ์ ์์ ์์ ์๋ชป ์๊ฐํด์ ์ถ๋ฐํ๋๋ ์์ธ ์ฒ๋ฆฌ๋ฅผ ๋๋ฌด ๋ง์ด ํ๊ฒ ๋์๊ณ , ์ฝ๋๊ฐ ์๋ชป๋์๋ค๋ ๊ฑธ ๊นจ๋ซ๊ณ ํผ์์ ์จ๋ฆํ๋ค๊ฐ ๊ตฌ๊ธ๋ง + ๋ฐฑ์ค ์ง๋ฌธ๋ค์ ํตํด์ ํด๊ฒฐํ์ต๋๋ค. ๋ํ ์ง๋ฌธ ๊ฒ์ํ์ ๋ณด๋ค ๋ณด๋ฉด ์์๊ฒ ์ง๋ง 2๋ ์ ์ ๋ฐ์ดํฐ๊ฐ ๋น ์ง๊ฑฐ๋ ์ถ๊ฐ๋์ด ์์ ๋ธ๋ก๊ทธ ํฌ์คํ ์ ๋ณด๋ฉด '??์ด๊ฒ ํฌํจ๋๋ค๊ณ ..?'์ถ์ ์์ ๋ค์ด๋ ์์ธ๋ค์ด ์์ต๋๋ค! ์ต๊ทผ ๋ธ๋ก๊ทธ๋ค์ ์ฐธ๊ณ ํ๋ ๊ฒ ์ ๋ต์ผ ๊ฒ ๊ฐ์ต๋๋ค.
2011๋ฒ์ ์ ํ์์ ์ฐพ๋ ๊ณผ์ ์ด ์กฐ๊ธ ์์ํ์ต๋๋ค. ๋ฐ์ ์๊ทธ๋ฆผ๊ณผ ์ค๋ช ์ ๋จ๊ฒจ๋๊ฒ ์ง๋ง, ์ดํด๊ฐ ๋์ง ์์ผ์ ๋ค๋ฉด ์ฐจ๋ผ๋ฆฌ ๊ฐ์ฅ ํ๋จ์ ์ฝ๋๋ฅผ ๋จผ์ ๋ณด๊ณ ๋ค์ ์๊ทธ๋ฆผ๊ณผ ์ค๋ช ์ ์ฝ๋ ๋ฐฉ์์ด ์กฐ๊ธ ๋ ์์ํ ์ ์์ต๋๋ค.
์ฐ์ 2011๋ฒ ์์์๋ 25114๋ฅผ ์ ๋ ฅํ๋๋ 6์ด ๋์ต๋๋ค.
์ผ๋จ 25114์์ 6์ด ๋์ค๊ฒ ๋ ๊ณผ์ ์ ์ง๊ด์ ์ผ๋ก ์ดํด๋ณด๋ฉด,
2/5/1/1/4
25/1/1/4
25/11/4
25/1/14
2/5/11/4
2/5/1/14
์ด๋ ๊ฒ ์ฌ์ฏ๊ฐ์ง๊ฐ ์์ต๋๋ค.
์ฌ์ฏ๊ฐ์ง๋ฅผ ์ง์ ์ฐพ์๋ณด๋ฉด ์ฐ์ i๋ฒ์งธ ์ธ๋ฑ์ค์ผ๋ i-1๋ฒ์งธ ์ธ๋ฑ์ค๋ฅผ 10์ ์๋ฆฌ์๋ก ๋ ์ ์๋๋ ์๋๋์ ๋ฐ๋ผ ๊ฒฝ์ฐ์ ์๊ฐ ๋ฐ์ํ๋ค๋ ๊ฒ๊น์ง๋ ์ดํดํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
๋ ํ์ด์ ์ค๋ช ํ์๋ฉด, ์์ 2๋ฒ์งธ ์ธ๋ฑ์ค(5)์์ 1๋ฒ์งธ ์ธ๋ฑ์ค(2)๋ฅผ ์ฐธ๊ณ ํ์๋, 10์ ์๋ฆฌ์๋ฅผ 2๋ผ๊ณ ๋๊ณ 5์ ํฉ์น๋ฉด 25๊ฐ ๋ฉ๋๋ค. 25๋ ์ํธํ ํ๋ ๋ฒ์(1~26)์ ํฌํจ๋๊ธฐ ๋๋ฌธ์ 2,5๋ก ํํํ ์๋ ์์ง๋ง, ํต์ผ๋ก 25๋ก ํํํ ์๋ ์์ต๋๋ค. ์ฆ ๊ฒฝ์ฐ์ ์๊ฐ 2๊ฐ ์๊ธฐ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ 3๋ฒ์ฌ ์ธ๋ฑ์ค์ธ 1์์๋ ์๊ธฐ๊ฐ ๋ฌ๋ผ์ง๋๋ค. 2๋ฒ์งธ ์ธ๋ฑ์ค ๊ฐ์ด 5์ด๋ฏ๋ก ๋ง์ฝ 5๊ฐ ์ญ์ ์๋ฆฌ์๋ก ์ค๊ฒ ๋๋ค๋ฉด 51์ด ๋๋๋ฐ, ์ด๋ ๋ฒ์์ ์ด๊ธ๋๋ ๊ฐ์ ๋๋ค. ์ฆ, ์ค์ง 5/1๋ก ํํํ๊ฒ ๋์ด ๊ฒฝ์ฐ์ ์๊ฐ 1๊ฐ๊ฐ ๋ฉ๋๋ค.
์ฌ๊ธฐ์ dp ์์ ์ด๋ป๊ฒ ์ธ์์ผ ํ ์ง ๊ณ ๋ฏผ์ ์ฌ๋ฐ๋ฅด๊ฒ ํ๋๋ ๋น๋น ๋๋ฌ ๊ฐ๋๋์ ์ฐจ์ด๊ฐ ์๊ธธ ๊ฒ ๊ฐ์ต๋๋ค.
์ด์ ๋ ์์ผ๋ก ๊ทธ๋ฆฐ ๊ทธ๋ฆผ์ ์ฒจ๋ถํ๋ฉฐ ์ค๋ช ์ ์งํํ๊ฒ ์ต๋๋ค.
ํ๊ธฐํ๋ ๋ชจ์ต์ GIF๋ก ๋ง๋ค์๋๋ฐ, ์ค๊ฐ์ค๊ฐ์ ํ๋ฉด ๋ นํ๊ฐ ์ข ์๋ ค์ ๊ฒฐ๊ณผ ์ด๋ฏธ์ง๋ถํฐ ์ฒจ๋ถํฉ๋๋ค. ์ด๊ฑธ๋ก ๋ฐ๋ก ์ดํด๊ฐ ๋๋ค๊ณ ํ์๋ฉด ๊ทธ๋ฅ ๋ฐ๋ก ๋ฌธ์ ๋ฅผ ํ๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ฐ์ฅ ์ฒ์ dp์ ์ด๊ธฐ๊ฐ๋ค์ 0์ด๋ผ๊ณ ํฉ์๋ค. dp = [0,0,0,0,0] ์ด๋ ์ธ๋ฑ์ค ์์์ด 0์ด ์๋๋ผ 1์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค.
1. 2์ผ๋ 2๋ง ๋๋ฏ๋ก ๊ฒฝ์ฐ์ ์๋ 1๊ฐ ์ ๋๋ค. dp[1] = 1
2. 5์ผ๋๋ ์ ๋ ฅ ๊ฐ์ด 25๋ผ๊ณ ์๊ฐํ๋ค๋ฉด 2,5 ๊ทธ๋ฆฌ๊ณ 25 ์ด๋ ๊ฒ ๊ฒฝ์ฐ์ ์๊ฐ ๊ฐ๊ฐ 1๊ฐ ์ฉ ๋์ต๋๋ค. ์ต์ข ํฉ์ dp[2] = 2
3. ์ฌ๊ธฐ์๋ถํฐ ์กฐ๊ธ ํท๊ฐ๋ฆด ์ ์๋๋ฐ, ๊ทธ๋ด๋๋ ์ง์ ์์ผ๋ก ์จ์ ๊ฒฝ์ฐ์ ์๋ฅผ ์ธ๋ณด๋ฉด ๋ฉ๋๋ค. 251์ผ๋๋ 51์ด ๋์ฌ ์ ์๊ธฐ ๋๋ฌธ์ ์์ dp[2] = 2์์ ๋ณํ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. 2/5/1 ๊ทธ๋ฆฌ๊ณ 25/1 ์ด๋ ๊ฒ ๋ ๊ฐ์ง ๊ฒฝ์ฐ๋ฐ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ฆ, dp[3] += dp[2] -> dp[3] = 2
4. ๊ทธ๋ฆฌ๊ณ 2511์ผ๋๋ 1/1, 11์ด ๋์ฌ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฒฝ์ฐ์ ์๊ฐ 2๊ฐ์ง ๋ฐ์ํฉ๋๋ค.
์ฌ๊ธฐ์ ์ด์ 1์ผ๋ 11์ผ๋, ๊ฐ๊ฐ dp[3]์ ๊ฐ๊ณผ dp[2]์ ๊ฐ์ ํ์ดํ๋ก ๋์ด๋ค๊ฐ ํฉํ๋๋ฐ, ๊ทธ ์ด์ ์ ๋ํด ๋ ์์ธํ ์ค๋ช ํด๋ณด๊ฒ ์ต๋๋ค.
1์ผ๋๋ ์์ 2,5,1์ ์ด์ฉํ ์์ ์กฐํฉ์ 1์ ๋ง๋ถ์ธ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. dp[3] = 2์๋๋ฐ, 2/5/1/1 ์ด๊ฑฐ๋ 25/1/1 ์ผ ์ ๋ฐ์ ์๊ธฐ์ dp ๊ฐ์ด ๋ณํ ์๊ฐ ์๋ค๋ ๋ป์ ๋๋ค. ์ฆ, dp[4] += dp[3]์ผ ์ ๋ฐ์ ์์ต๋๋ค.
11์ผ๋๋ ๋์ผํ ์๋ฆฌ์ด์ง๋ง, 2,5,1,1์์ 1,1๋ฅผ ๋บ, ์ฆ dp[2]์ ๊ฐ์ ๋ํด์ค์ผ ํฉ๋๋ค. 2/5/11์ด๊ฑฐ๋ 25/11์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฆ, dp[4] += dp[2]๊ฐ ๋ฉ๋๋ค.
5. ๋ง์ง๋ง, 4์ผ๋, 25114์ผ๋๋ ๋ง์ฐฌ๊ฐ์ง ์ ๋๋ค. dp[5] += dp[3], dp[5] += dp[4]
๊ทธ๋ ๋ค๋ฉด ์ด์ ์ ํ์์ ๋ง๋ค๊ณ ๊ฒฐ๋ก ์ ๋ง๋ค ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
์ฆ, 1์ ์๋ฆฌ ์๋ง ๊ฐ๋ฅํ๋ค๋ฉด dp[i] += dp[i-1],
๊ทธ ์ ์ธ๋ฑ์ค ๊ฐ์ 10์ ์๋ฆฌ์๋ก ํฌํจํด์ ๊ทธ๊ฒ ๋ฒ์(10~26)์ ๋ค์ด๊ฐ๋ค๋ฉด dp[i] += dp[i-2]
๊ทธ๋ฐ๋ฐ ๋ ์์ ๋ณธ ๋ ๋ฒ์งธ ์ธ๋ฑ์ค, 5์ผ๋๊ฐ ๊ทธ๋ผ ๋ ผ๋ฆฌ์ ๋ง์ง ์์ต๋๋ค. dp[2] += dp[1], dp[2] += dp[0]์ด ๋์ด์ผ ํ๋๋ฐ ์ฐ๋ฆฌ๋ ํ์ฌ dp[0]์ด ์์ฃ . ์ฆ, dp์ ๊ธธ์ด๊ฐ ์ ๋ ฅ๊ฐ์ ๊ธธ์ด๋ณด๋ค 1๊ฐ ๋ ๊ธธ์ด์ผ ํ๊ณ , dp[0]์ ๊ฐ์๋ 1์ด ๋ํดํธ๋ก ๋ค์ด๊ฐ์์ด์ผ ๋ ผ๋ฆฌ๊ฐ ๋ง์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ ๋ ๊ฑฐ๊ธฐ์ ๋ง์ถฐ์ ์ ๋ ฅ๊ฐ code์๋ ์ฒ์์ code[0] = 0์ด๋ผ๋ ์๋ฏธ์๋ ๊ฐ์ ๋ฃ์ด์ฃผ์ด ์ธ๋ฑ์ค๋ฅผ ๋ง์ถฐ์ฃผ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด dp ๊ณ์ฐ ๋ก์ง ์์ ์ด๋ ๊ฒ ์ ์ํ ์ ์์ต๋๋ค.
length = len(code) #์
๋ ฅ๋ฐ์ ์ํธ ์ซ์๊ฐ code
dp = [0] * length
dp[0] = dp[1] = 1 #dp[0] = 1 ๋ํดํธ๊ฐ, dp[1]์ ์์ 25114์์ 2์๋ง ํด๋นํ๋ฏ๋ก ๋ฌด์กฐ๊ฑด 1์ด ๋จ.
for i in range(2, length):
first = int(code[i]) #ํ์๋ฆฌ ์
tenth = int(code[i-1])*10 + int(code[i])#๊ทธ ์ ์ธ๋ฑ์ค๋ฅผ ์ฐธ๊ณ ํด์ ๋ ์๋ฆฌ์๋ก ๊ตฌ์ฑ
if first > 0: dp[i] += dp[i-1] #ํ ์๋ฆฌ ์๊ฐ 0๋ณด๋ค ํด๋
if tenth >= 10 and tenth <= 26: dp[i] += dp[i-2] #๋ ์๋ฆฌ ์๊ฐ 10์ด์ 26์ดํ์ผ๋
์ด์ ๋ก์ง์ ๋ค ์งฐ์ผ๋ฉด ์์ธ ์ฒ๋ฆฌ๋ฅผ ํด์ค์ผ ํฉ๋๋ค.
๋ฌธ์ ์์๋ '์ํธ๊ฐ ์๋ชป๋์ด ์ํธ๋ฅผ ํด์ํ ์ ์๋ ๊ฒฝ์ฐ์๋ 0์ ์ถ๋ ฅํ๋ค.' ๋ผ๊ณ ๋์ด์์ต๋๋ค. ์ํธ๊ฐ ์๋ชป๋๋ค๋ ๊ฑด ์ด๋ค ๊ฒฝ์ฐ์ธ์ง ๋จ์ํ ์๊ฐํด๋ณด๋ฉด, ์ฐ์ 0์ด ์๊ฒ ์ต๋๋ค. ๋ฒ์๋ 1~26์ธ๋ฐ 0์ ์ ๋ ฅ ๋ฐ์ผ๋ฉด ํด์ํ ์ ์๊ฒ ์ฃ . 00020, 001, 01 ๋ฑ ๋งจ ์ฒ์์ 0์ด ๋ถ์ผ๋ฉด ๋ค ์๋ชป๋ ๊ฒฝ์ฐ๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด 0์ด ์ค๊ฐ์ ๋ค์ด๊ฐ ์์ผ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ์์๋ก 1304๋ฅผ ์๊ฐํด๋ณด๊ฒ ์ต๋๋ค. ์ค๊ฐ์ 10, 20์ด ์๋ 30์ด ๋ค์ด๊ฐ ์๋ค๊ณ ์๊ฐํ ์๋ ์๊ณ , ๋ถํ์ํ 0์ด ๋ค์ด๊ฐ 04๊ฐ ๋ค์ด๊ฐ๋ค๊ณ ์๊ฐํด๋ ์ข๊ฒ ์ต๋๋ค. ์ด๊ฒ ๋ํ ์ ํด์ง ๊ท์น์ ์ด๊ธ๋๋ ์ํธ์ด๊ธฐ ๋๋ฌธ์ 0์ด ์ถ๋ ฅ๋์ด์ผ ํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ๋งจ ์ฒ์์ ์ ๋ ฅ ๋ฐ์๋ง์ for๋ฌธ์ ๋๋ฉด์ ์ด๋ฐ ์์ธ๋ฅผ ๋ฐ๋ก ๊ฑธ๋ฌ๋ด์ผ ํ ๊น์? ๊ทธ๋ดํ์๊ฐ ์์ต๋๋ค.
์ ํฌ๊ฐ ์ง ๋ก์ง์ ๋ฐ๋ฅด๋ฉด, ์ฐ์ dp[1] = 1, dp[2] = 2๊น์ง๋ ์ฝ๊ฒ ์๊ฐํ ์ ์์ต๋๋ค.
๊ทธ ๋ค์ index๊ฐ 3์ด ๋์๊ณ , code[3] = 0์ ๋๋ค. ํ์๋ฆฌ์ ์ผ๋๋ 0์ด๊ณ , ๋ ์๋ฆฌ ์ ์ผ๋๋ 30์ด์ฃ . ์ ํฌ์ ์กฐ๊ฑด๋ฌธ์๋ ์๋ฌด๊ฒ๋ ๊ฑธ๋ฆฌ์ง ์๊ธฐ ๋๋ฌธ์ dp[3]์๋ ๊ทธ ์ด๋ ํ ๊ฐ๋ ๋ํด์ง์ง ์์ต๋๋ค.
์ฆ, dp[3] = 0์ด๋ผ๋ ๊ฐ์ด ๊ทธ๋๋ก ์ ์ง๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ index๊ฐ 4๊ฐ ๋๋ฉด dp[3] = 0์ด๊ธฐ ๋๋ฌธ์ dp[4] = 0์ด ๋์ด ๊ฒฐ๊ณผ ๊ฐ์ ์ํธ๋ฅผ ํด์ํ ์ ์๋ ๊ฒฝ์ฐ์ธ 0์ด ์ถ๋ ฅ๋ฉ๋๋ค.
์ฆ, ๋งจ ์ฒ์์ 0์ด ๋ถ๋ ๊ฒฝ์ฐ๋ง ์ ๋ ฅ ๋ฐ์ ํ ๋ฐ๋ก ์ฒ๋ฆฌ ํด์ฃผ๋ฉด, ๋ค๋ฅธ ์์ธ๋ค์ ๋ก์ง ๋ด์์ ์์์ 0์ ์ถ๋ ฅํ ์ ์๊ฒ ๋ฉ๋๋ค.
<์ ์ฒด์ฝ๋>
import sys
code = [0] #์ธ๋ฑ์ค ๊ฐ ๋ง์ถ๊ธฐ์ฉ 0 ์ด๊ธฐ๊ฐ
code += list(sys.stdin.readline())
code.pop() #'\n'๋ ๋ฆฌ๊ธฐ
if code[1] == '0':
print(0)
exit(0)
length = len(code)
dp = [0] * length
dp[0] = dp[1] = 1
for i in range(2, length):
first = int(code[i])
tenth = int(code[i-1])*10 + int(code[i])
if first > 0: dp[i] += dp[i-1]
if tenth >= 10 and tenth <= 26: dp[i] += dp[i-2]
print(dp[length-1]%1000000)
๋ธ๋ก๊ทธ๋ฅผ ์ฌ๋ฌ ๊ตฐ๋ฐ ๋ดค๋๋ฐ ์ดํดํ๊ธฐ๊ฐ ์ฝ์ง ์์์ ์ต์ ์ ๋คํด์ ํ์ด๋ฅผ ํด๋ณด๋ ค๊ณ ํ์ต๋๋ค. ์ดํด๊ฐ ๋์์์ง๋ ๋ชจ๋ฅด๊ฒ ์ต๋๋คใ .ใ ํน์ ์ ๊ฐ ์๋ชป ๊ธฐ์ฌํ ๋ถ๋ถ์ด ์๋ค๋ฉด ์ธ์ ๋ ์ง ๋๊ธ ๋จ๊ฒจ์ฃผ์ธ์ ๊ฐ์ฌํฉ๋๋ค
'Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค 1924 ํ์ด์ฌ (0) | 2021.06.29 |
---|---|
๋ฐฑ์ค 1946 ํ์ด์ฌ (0) | 2021.05.04 |
๋ฐฑ์ค 1476 ํ์ด์ฌ (0) | 2021.04.07 |
๋ฐฑ์ค 1021๋ฒ ํ์ด์ฌ (0) | 2021.04.02 |
๋ฐฑ์ค 1550๋ฒ ํ์ด์ฌ (0) | 2021.03.27 |