어흥

[백준 2011] 암호코드 (C++) 본문

알고리즘/백준

[백준 2011] 암호코드 (C++)

라이언납시오 2020. 3. 23. 20:26
728x90
반응형

문제 링크: https://www.acmicpc.net/problem/2011

 

2011번: 암호코드

문제 상근이와 선영이가 다른 사람들이 남매간의 대화를 듣는 것을 방지하기 위해서 대화를 서로 암호화 하기로 했다. 그래서 다음과 같은 대화를 했다. 상근: 그냥 간단히 암호화 하자. A를 1이라고 하고, B는 2로, 그리고 Z는 26으로 하는거야. 선영: 그럼 안돼. 만약, "BEAN"을 암호화하면 25114가 나오는데, 이걸 다시 글자로 바꾸는 방법은 여러 가지가 있어. 상근: 그렇네. 25114를 다시 영어로 바꾸면, "BEAAD", "YAAD", "

www.acmicpc.net

1. 주의할 점

- 최대 길이가 5000자, 결과는 백만으로 나눈 나머지를 출력한다.

- 시작숫자가 0이면 불가능하므로 0을 출력한다.

 

2. 구현

- 현재 확인하는 숫자가 0이 아니라면 우선 이전값만큼 가능하다(뒤에 숫자하나만 추가하면 되기 때문)

- 현재 확인하려는 숫자와 그 전 숫자가 10~26이면 마지막 2개를 통해 새로운 글자가 표현 가능하다. 즉, DP[n-2]만큼의 암호가 또 생길 수 있다.

 

#define MOD 1000000
#include <iostream>
#include <string>
using namespace std;
long long dp[5001];
int main() {
	string str;
	cin >> str;
	dp[0] = 1;
	dp[1] = 1;
	if (str[0]-'0' == 0) cout << 0;
	else {
		for (int i = 2; i <= str.size(); i++) {
			if (str[i - 1] - '0' > 0)
				dp[i] = dp[i - 1] % MOD;
			int x = (str[i - 2] - '0') * 10 + str[i-1] - '0';
			if (10 <= x && x <= 26) 
				dp[i] = (dp[i] + dp[i - 2]) % MOD;		
		}
		cout << dp[str.size()];
	}
	system("pause");
	return 0;
}
728x90
반응형
Comments