πλ¬Έμ νμνκΈ°
- A = 1, B = 2, ..., Z = 26μΌλ‘νλ μνΈν λ°©μ μ¬μ©
- ν΄λΉ λ°©μμ μ¬μ©ν κ²½μ° νλμ μνΈμ λν΄ μνΈμ ν΄μμ΄ μ¬λ¬ κ° λμ¬ μ μμ
- 25114 => "BEAAD", "YAAD", "YAN", "YKD", "BEKD", "BEAN"
- μ΄λ€ μνΈκ° μ£Όμ΄μ§λ©΄ ν΄λΉ μνΈμ ν΄μμ κ°μ§μ ꡬνκΈ°
μ λ ₯
- 5000μ리 μ΄νμ μνΈ(μ«μλ‘ μ΄λ£¨μ΄μ Έμμ)
μΆλ ₯
- λμ¬ μ μλ ν΄μμ κ°μ§μλ₯Ό 1000000μΌλ‘ λλ λλ¨Έμ§ μΆλ ₯
- μνΈλ₯Ό ν΄μν μ μλ κ²½μ° 0 μΆλ ₯
νμ΄ λ°©λ² μκ°ν΄λ³΄κΈ°
볡νΈννκΈ° μν΄ νμν μνΈ κΈμμλ 1~2μ리μ΄λ―λ‘ dp[n]μ nμ리κΉμ§ νμΈνμ λ κ°λ₯ν ν΄μμ κ°μ§μλ‘ μμ νκ³ , dp[n]μ λν΄ dp[n-2], dp[n-1]μ νμ©ν μ νμμ μΈμμ νμ΄ν μ μλ€.
πμ½λ μ€κ³νκΈ°
- λ³μ pwdμ μνΈλ₯Ό μ λ ₯λ°λλ€.
- λ§μ½ pwdμ 첫κΈμκ° '0'μ΄λΌλ©΄ 0μ μΆλ ₯νκ³ νλ‘κ·Έλ¨μ μ’ λ£νλ€.
- dpλ₯Ό pwd κΈΈμ΄λ§νΌμ μμλ₯Ό κ°μ§ 리μ€νΈλ‘ μ΄κΈ°ννκ³ , dp[0]μ 1λ‘, λλ¨Έμ§ μμλ 0μΌλ‘ μ΄κΈ°ννλ€.
- dp[1]λ {pwd[0], pwd[1]}μ΄ 10~26 μ¬μ΄μ μ«μμΈμ§ νμΈνκ³ , {pwd[1]}μ΄ 1~9 μ¬μ΄μ μ«μμΈμ§ νμΈν΄μ κ³μ°νλ€.
- iλ₯Ό 2λ‘ μ΄κΈ°ννκ³ , iκ° nλ³΄λ€ μμ λ λμ μλ κ³Όμ μ λ°λ³΅νλ©° dp[i]λ₯Ό κ°±μ νλ€.
- {pwd[i]}κ° 1~9 μ¬μ΄μ μ«μλΌλ©΄ p1λ₯Ό 1λ‘ μ΄κΈ°ννκ³ , μλλΌλ©΄ 0μΌλ‘ μ΄κΈ°ννλ€.
- {pwd[i-1], pwd[i]}κ° 10~26 μ¬μ΄μ μ«μλΌλ©΄ p2λ₯Ό 1λ‘ μ΄κΈ°ννκ³ , μλλΌλ©΄ 0μΌλ‘ μ΄κΈ°ννλ€.
- dp[i]λ₯Ό (dp[n-1]*p1 + dp[n-2]*p2)λ₯Ό 1000000λ‘ λλ λλ¨Έμ§λ‘ κ°±μ νλ€.
- dp[len(pwd)-1]μ μΆλ ₯νλ€.
πμλνμ°¨ μμ μ¬ν
python 1νμ°¨ (97% IndexError)
- pwdμ κΈΈμ΄κ° 1μΌ λλ dp[1]μ μ΄κΈ°ννλ €κ³ ν΄μ IndexErrorκ° λ¬λ€. ν΄λΉ λΆλΆμ μμ ν΄μ£Όμλ€.
java 1νμ°¨ (63%(?) νλ Έμ΅λλ€)
- μνΈλ₯Ό ν΄μν μ μλ κ²½μ°(μ²μμ΄ 0μΌλ‘ μμνλ κ²½μ°) 0μ μΆλ ₯νμ§ μκ³ νλ‘κ·Έλ¨μ μ’ λ£μμΌλ²λ Έλ€.
πμ λ΅ μ½λ
Python
import sys
input = sys.stdin.readline
pwd = input().strip()
N = len(pwd)
if pwd[0] == '0':
print(0)
exit()
dp = [1] + [0]*(N-1)
for i in range(1, N):
p1 = 1 if 1 <= int(pwd[i]) <= 9 else 0
p2 = 1 if 10 <= int(pwd[i-1]+pwd[i]) <= 26 else 0
if i == 1:
dp[i] = p1 + p2
else:
dp[i] = (dp[i-1]*p1 + dp[i-2]*p2) % 1000000
print(dp[N-1])
Java
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String pwd = br.readLine();
if (pwd.charAt(0) == '0') {
System.out.println(0);
return;
}
int N = pwd.length();
int[] dp = new int[N];
dp[0] = 1;
for (int i = 1; i < N; i++) {
int num1 = Character.getNumericValue(pwd.charAt(i));
int num2 = Integer.parseInt(""+pwd.charAt(i-1)+pwd.charAt(i));
int p1 = (num1 >= 1 && num1 <= 9) ? 1 : 0;
int p2 = (num2 >= 10 && num2 <= 26) ? 1 : 0;
if (i == 1) {
dp[i] = p1 + p2;
} else {
dp[i] = (dp[i-1]*p1 + dp[i-2]*p2) % 1000000;
}
}
System.out.println(dp[N-1]);
}
}
728x90