λ°±μ€ 2011 νμ΄μ¬
https://www.acmicpc.net/problem/2011
2011λ²: μνΈμ½λ
λμ¬ μ μλ ν΄μμ κ°μ§μλ₯Ό ꡬνμμ€. μ λ΅μ΄ λ§€μ° ν΄ μ μμΌλ―λ‘, 1000000μΌλ‘ λλ λλ¨Έμ§λ₯Ό μΆλ ₯νλ€. μνΈκ° μλͺ»λμ΄ μνΈλ₯Ό ν΄μν μ μλ κ²½μ°μλ 0μ μΆλ ₯νλ€.
www.acmicpc.net
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)
λΈλ‘κ·Έλ₯Ό μ¬λ¬ κ΅°λ° λ΄€λλ° μ΄ν΄νκΈ°κ° μ½μ§ μμμ μ΅μ μ λ€ν΄μ νμ΄λ₯Ό ν΄λ³΄λ €κ³ νμ΅λλ€. μ΄ν΄κ° λμμμ§λ λͺ¨λ₯΄κ² μ΅λλ€γ .γ νΉμ μ κ° μλͺ» κΈ°μ¬ν λΆλΆμ΄ μλ€λ©΄ μΈμ λ μ§ λκΈ λ¨κ²¨μ£ΌμΈμ κ°μ¬ν©λλ€