문제 : https://www.acmicpc.net/problem/12042


[알고리즘풀이]

i번째에 올 수 있는 알파벳은 ( i - 1 ), i , ( i + 1 ) 번 째에 있는 알파벳 중 하나다.

즉, ( i - 1), i , ( i + 1) 에 서로 다른 알파벳이 몇 개 있느냐에 따라 경우의 수가 달라진다.

각 자리별로 올 수 있는 알파벳의 경우의 수를 구하고, 모두 곱하면 답이 된다.

#include<iostream>
#include<string>
#include<vector>

#define m 1000000007
using namespace std;

int main(void) {
	int t, n = 1;
	cin >> t;
	while (t--) {
		string in;
		cin >> in;
		vector<int> v;
		for (int i = 0; i < in.length(); i++) {
			int c = 0;
			if (i == 0) {
				if (in.length() != 1 && in[i] != in[i + 1])
					c += 2;
				else
					c++;
			}
			else if (i == in.length() - 1) {
				if (in[i] != in[i - 1])
					c += 2;
				else
					c++;
			}
			else {
				bool alphabet[26] = {};
				alphabet[in[i-1] - 'a'] = true;
				alphabet[in[i] - 'a'] = true;
				alphabet[in[i + 1] - 'a'] = true;
				for (int i = 0; i < 26; i++)
					if (alphabet[i])
						c++;
			}
			v.push_back(c);
		}
		long long ans = 1;
		for (int i = 0; i < v.size(); i++) {
			ans *= v[i];
			ans = ans % m;
		}
		cout << "Case #" << n++ << ": " << ans << '\n';
	}
}

 

+ Recent posts