백준/실버
[백준 25328번] 문자열 집합 조합하기 (C++)
게임개발기원
2023. 6. 21. 12:28
문제링크 : https://www.acmicpc.net/problem/25328
25328번: 문자열 집합 조합하기
알파벳 소문자로 구성된 문자열 X, Y, Z가 주어진다. 각각의 문자열에는 중복된 문자가 존재하지 않는다. 문자열 S에 있는 문자 중 임의로 k개를 선택하여 문자열 S에서의 순서를 유지하여 만든 모
www.acmicpc.net
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;
string x, y, z;
int K;
map<string, int> m;
void backtracking(int idx, string str, string tmp)
{
if(tmp.size() == K)
{
m[tmp]++; //해당 문자열 갯수 증가
return;
}
for(int i=idx; i<str.size(); i++)
{
backtracking(i+1, str, tmp+str[i]); //하나씩 검토
}
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> x >> y >> z;
cin >> K;
backtracking(0, x, ""); //각각 문자열로 백트래킹
backtracking(0, y, "");
backtracking(0, z, "");
bool flag = false;
for(auto i : m)
{
if(i.second >= 2) //두 번이상 나타나는 것만 출력
{
cout << i.first << "\n";
flag = true;
}
}
if(!flag) cout << -1; //없음
return 0;
}
각각의 문자열들을 백트래킹을 통해서 하나씩 검토해준다.
이때 문자열을 하나씩 더해주는 tmp의 사이즈가 K와 같아지면 해당 tmp 문자열의 갯수를 더해준다 (m[tmp]++)
이를 x, y, z 각각의 문자열에 대해 전부 확인해준다.
이후에 map에 저장된 각 문자열들의 int 값을 확인하고 이 값이 2이상, 즉 두 번이상 나타난 것만 출력하도록 한다.
두 번이상 나타나는 것이 없을 경우에는 표시용으로 사용한 flag를 확인하여 -1을 출력하도록 한다.