c/c++ 백준_1342 행운의 문자열 본문

알고리즘_백준/문자열

c/c++ 백준_1342 행운의 문자열

giron 2021. 7. 27. 21:51
728x90

알고리즘은 간단했다. 단순히 완전 탐색 방식으로 조합의 모든 경우를 계산하고 중복되는 만큼 ex) aabab와 같은 경우 3! 2!으로 나눠주면 됐다.

문자열보단 조합론(?)에 가까운 문제였다. 하지만 조합은 1 3 2 처럼 모두 다른 숫자나 문자로 구성되었지만 이 문제는 중복된 문자들도 있기 때문에 각 문자마다 id값을 주어 구분하였다.

#include <iostream>
#include <string>
#include <vector>
using namespace std;

vector<pair<int, char>> v;// id, 문자
int over[27];
int visited[27];
string s;
int n;
char ans[11];
int res = 0;

int factorial(int n) {

	long long sum = 1;
	for (int i = 1; i <= n; ++i) {
		sum = sum * i;
	}
	return sum;
}
void com(int x) {
	if (x == s.size()) {
		for (int i = 0; i < x-1; ++i) {
			if (ans[i] == ans[i + 1]) {
				return ;
			}
		}
		res++;
	}

	for (int i = 0; i < s.size(); ++i) {
		if (!visited[v[i].first]) {
			visited[v[i].first] = 1;
			ans[x] = (v[i].second);
			com(x + 1);
			visited[v[i].first] = 0;
		}
	}
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	cin >> s;
	for (int i = 0; i < s.size(); ++i) {
		
		over[s[i] - 'a']++;
		v.push_back({ i,s[i] });
	}

	com(0);
	int value = 1;

	for (int i = 0; i < 26; ++i) {
		if(over[i])
			value *= factorial(over[i]);
	}
	int answer = res / value;
	cout << answer;

}

그 외에는 N과M 문제와 비슷한 것 같다.

728x90

'알고리즘_백준 > 문자열' 카테고리의 다른 글

[백준] C/C++ acmicpc_5430 AC  (0) 2021.08.30
acmicpc_19583(싸이버개강총회)  (0) 2021.02.23
acmicpc_9935 (문자열 폭발)  (0) 2020.10.27
acmicpc_9251 (LCS)  (0) 2020.10.26
Comments