하루하나코딩
백준 2011 : 암호코드 c++
HAHAKO
2023. 1. 25. 11:04
코드
#include <iostream>
#include <string.h>
using namespace std;
long long dp[5001];
int main(){
string password;
int arr[5001];
cin >> password;
for(int i = 1; i <= password.length(); i++){
arr[i] = password[i-1] - '0';
}
if(password.length() == 1 && password[0] == '0'){
cout << 0 << endl;
return 0;
}
dp[0] = 1;
for(int i = 1; i <= password.length(); i++){
if(arr[i] >=1 && arr[i] <= 9){
dp[i] = dp[i-1]%1000000;
}
if(i == 1) continue;
int temp = arr[i] + arr[i-1]*10;
if(temp >=10 && temp <=26){
dp[i] = (dp[i-2]+dp[i])%1000000;
}
}
cout << dp[password.length()] << endl;
return 0;
}
알게된 점
string으로 다뤄서 띄어쓰기 없이 입력받을 수 있다.
경우를 나누어서 dp를 더해야되는데
앞숫자랑 두자리수가 된다고 생각하는 경우 + 앞숫자랑 따로 한자리수로 생각하는 경우이다.
앞숫자랑 따로 한자리수로 생각하는 경우는 0만아니면 되기 때문에 그냥 dp[i] = dp[i-1] 이다.
앞숫자랑 두자리수가 된다고 생각하는 경우는 dp[i] = dp[i-2] 이다.
즉 만약 두자리수가 될 수 있다면, (두자리수로 봤을 때 10<=두자리수<=26이라면)
dp[i-2] 를 dp[i]에 더해주면 된다.
어렵당..