[BOJ][๐ก4][๋ฐฑ์ค#17255] N์ผ๋ก ๋ง๋ค๊ธฐ
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold IV
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
์คํ๋ ๋ ธํธ์ ์๋ฅผ ์ ๋ค๊ฐ ์๊ฐ ๋ง๋ค์ด์ง๋ ๋ฐฉ์์ ๊นจ๋ฌ์๋ค. ์ฒ์์ ์ด๋ค ์ซ์ ํ๋๋ฅผ ์ ๊ณ ๋ง๋ค์ด์ง ์์ ์ผ์ชฝ์ด๋ ์ค๋ฅธ์ชฝ์ ์ซ์๋ฅผ ๊ณ์ ๋ถ์ด๋ฉด ์ด๋ค ์ย N์ด๋ ๋ง๋ค ์ ์๋ค๋ ๊ฒ์ด๋ค. ๋ค์ ๋งํด ์ด๋ค ์ย N์ ๋ง๋ค๊ธฐ ์ํด์๋, ์ฒ์์ ์ด๋ค ์ซ์๋ฅผ ํ๋ ์ ๊ณ ์๋์ ๋ ๊ฐ์ง ํ๋์ ๋ฐ๋ณตํ๋ค.
์์ ์ผ์ชฝ์ ์ซ์๋ฅผ ํ๋ ์ ๋๋ค. ์์ ์ค๋ฅธ์ชฝ์ ์ซ์๋ฅผ ํ๋ ์ ๋๋ค.
์คํ๋ ์ด๋ค ์ย N์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์๊ฐ ๋ช ๊ฐ์ง์ธ์ง ๊ถ๊ธํด์ก๋ค. ์ด๋ฅผ ์์๋ด๋ ํ๋ก๊ทธ๋จ์ ์์ฑํด์ฃผ์. ์ซ์๋ฅผ ์ ๋ ๊ณผ์ ์์ ๋์จ ์๊ฐ ์์๋๋ก ๋ชจ๋ ๊ฐ๋ค๋ฉด ๊ฐ์ ๋ฐฉ๋ฒ์ด๋ค. ๋จ, ์ซ์๋ฅผ ์ ๋ ๊ณผ์ ์์ ์๋ 0์ผ๋ก ์์ํ ์ ์๋ค.
์ ๋ ฅ
์์ด ์๋ ์ ์ย N์ด ์ฃผ์ด์ง๋ค. (0 โค N โค 10,000,000)
์ถ๋ ฅ
N์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ์ถ๋ ฅํ๋ค.
์์
์์ 1
์ ๋ ฅ
521
์ถ๋ ฅ
4
์์ 2
์ ๋ ฅ
9111
์ถ๋ ฅ
4
My Sol
def main():
def dfs(S, l):
if l == 1: return 1
if D.get(S, 0): return D[S]
left_S, right_S = S[1:], S[:-1]
D[S] = dfs(left_S, l-1)
if left_S == right_S: return D[S]
D[S] += dfs(right_S, l-1)
return D[S]
S = input()
l = len(S)
if l==1: return 1
D = {}
dfs(S, l)
return D[S]
print(main())
DP ๋ฐฉ์์ ์ผ๋ถ ์ฐจ์ฉํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค. ํ์ผ ๋ง์ถ๊ธฐ์ฒ๋ผ ์๋ค๋ก ์ซ์๋ค์ ์ถ๊ฐํ๋ค๊ณ ์๊ฐํด๋ณด๋ ๊ฒ์ด๋ค. ๊ทธ๋ ๋ค๋ฉด ์ต์ด ๋ฐ์ ์๋ฅผ ๋ง๋ค๊ธฐ ์ํด์๋ ์ด๋ณด๋ค ๊ธธ์ด๊ฐ 1 ์์ ์๋ก๋ถํฐ ๋ค์ ์ซ์ ํ๋๋ฅผ ๋ถ์ด๊ฑฐ๋, ์์ ์ซ์ ํ๋๋ฅผ ๋ถ์ด๋ ๊ฒ์ด๋ค. ์ด๋ ์๋ฅผ ๊น์๋ด๋ฆฌ๋ค๊ฐ ํน์ ์์ ๋ค๋ค๋ฅด๋ฉด, ์ด์ ์ ๋์๋ ์์ผ ์ ์๋ค. ๊ทธ๋ ๋ค๋ฉด ๊ทธ ์๋ก๋ถํฐ ๊น์๋ด๋ฆฌ๋ ๊ฒฝ์ฐ์ ์๋ ๋ค์ ํด๋ณด์ง ์์๋ ๋๋ฏ๋ก memoizationํ๋ค. ๋ค๋ง ๋ฐฐ์ด์ ์ ์ฅํ๋ ๊ฒ์ ์๋๊ณ , dictionary์ ์ ์ฅํ๋ค.
ํด๋น ์๊น์ง ๋ค๋ค๋ฅด๋ ๊ฒฝ๋ก๋ ์ ๋ํฌํ๋ค๋ ์ ์ ์ธ๋ฐ, ์ข์ธก๊ณผ ์ฐ์ธก์ ๊ฐ๊ฐ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ๋ฅผ ๋ชจ๋ ๋ํ๊ธฐ ์ํด์๋ ์ข์ธก์ ํ๋, ์ฐ์ธก์ ํ๋๋ฅผ ๋บ ์๊ฐ ์๋ก ๋ฌ๋ผ์ผ ํ๋ค. ๋ค์ ๋งํ๋ฉด ์ข์ธก๊ณผ ์ฐ์ธก์ ์๋ฅผ ๋บ ๊ฒ์ด ๊ฐ๋ค๋ฉด, ๊ฒฝ๋ก๊ฐ ๊ฐ์ผ๋ฏ๋ก ๋ค๋ฅธ ๊ฒฝ์ฐ๊ฐ ์๋ ๊ฒ์ด๋ค. ๋๋ฌธ์ ํ๋๋ฅผ ๋บ ๊ฒฝ์ฐ๋ง ๊ณ ๋ คํ๋ฉด ๋๊ฒ ๋ค.
์ซ์๊ฐ ํ ์๋ฆฌ๋ผ๋ฉด ๋ ๋นผ๊ณ ๋ถ์ผ ๊ฒ์ด ์์ผ๋ฏ๋ก ๊ฒฝ์ฐ์ ์ 1์ returnํ๊ณ , ๋ง์ฝ dictionary D์ ์๋ ์๋ผ๋ฉด ํด๋น ์๊ฐ ๊น์์ง๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ธฐ๋กํ D[S]
๋ฅผ ๋ฐํํ๋ค. ๋ง์ฝ ์ฒซ ์๊ฐ 10์ ๋์ง ์๋๋ค๋ฉด, ๊ทธ๋ฅ 1์ ๋ฐํํ๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋๊ธ๋จ๊ธฐ๊ธฐ