알고리즘/백준풀이6. 다이나믹프로그래밍
(21) [C, C++, Java] 백준 No.2011 : 암호코드
Storage Gonie
2019. 5. 17. 22:31
반응형
문제
풀이
자세한 풀이 : https://ldgeao99.tistory.com/entry/챕터3-22-DP-문제-풀이4-5-백준-No2011-암호코드
# C++
#include <iostream>
using namespace std;
int d[5001];
int main()
{
string s;
cin >> s;
s = " " + s; // index를 1부터 사용하기 위함.
int s_len = s.length() - 1;
d[0] = 1;
for (int i = 1; i <= s_len; i++){
/*s[i] 한 자리 수 인 경우로 인식하여 개수 카운트*/
int c = s[i] - '0';
if (1 <= c && c <= 9){
d[i] += d[i-1];
d[i] %= 1000000;
}
/*s[i-1], s[i]두 자리 수 인 경우로 인식하여 개수 카운트*/
if (i == 1)
continue;
if (s[i-1] == '0') // 두 자리 중 앞자리가 0이면 두자리수가 아니므로 카운트할 필요가 없음
continue;
c = stoi(s.substr(i-1, 2));
if(10 <= c && c <= 26){
d[i] += d[i-2];
d[i] %= 1000000;
}
}
cout << d[s_len] << "\n";
}
# C
#include <cstring>
#include <cstdio>
int d[5001];
int mod = 1000000;
char s[5002];
int main() {
scanf("%s",s+1);
int n = strlen(s+1);
d[0] = 1;
for (int i=1; i<=n; i++) {
int x = s[i] - '0';
if (1 <= x && x <= 9) {
d[i] += d[i-1];
d[i] %= mod;
}
if (i==1) {
continue;
}
if (s[i-1] == '0') {
continue;
}
x = (s[i-1]-'0')*10 + (s[i]-'0');
if (10 <= x && x <= 26) {
d[i] += d[i-2];
d[i] %= mod;
}
}
printf("%d\n",d[n]);
return 0;
}
# Java
import java.util.*;
import java.math.*;
public class Main {
public static int mod = 1000000;
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine().trim();
int n = s.length();
s = " " + s;
int[] d = new int[n+1];
d[0] = 1;
for (int i=1; i<=n; i++) {
int x = s.charAt(i) - '0';
if (1 <= x && x <= 9) {
d[i] += d[i-1];
d[i] %= mod;
}
if (i==1) {
continue;
}
if (s.charAt(i-1) == '0') {
continue;
}
x = (s.charAt(i-1)-'0')*10 + (s.charAt(i)-'0');
if (10 <= x && x <= 26) {
d[i] += d[i-2];
d[i] %= mod;
}
}
System.out.println(d[n]);
}
}
반응형