문제링크 : https://www.acmicpc.net/problem/1759
1759번: 암호 만들기
첫째 줄에 두 정수 L, C가 주어진다. (3 ≤ L ≤ C ≤ 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다.
www.acmicpc.net
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;
vector<char>v;
vector<char>result;
int L, C;
void func(int size, int cur)
{
if(size==L)
{
int consonant = 0, vowel = 0;
for(int i=0; i<result.size(); i++)
{
if (result[i] == 'a' || result[i] == 'e' || result[i] == 'i' || result[i] == 'o' || result[i] == 'u') vowel++; //모음 체크
else consonant++; //자음 체크
}
if(vowel>=1 && consonant>=2) //최소 한개의 모음과 최소 두개의 자음으로 구성
{
for(int i=0; i<result.size(); i++)
{
cout << result[i];
}
cout << "\n";
}
}
for(int i=cur; i<v.size(); i++)
{
result.push_back(v[i]);
func(size+1, i+1);
result.pop_back(); //백트래킹
}
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> L >> C;
for(int i=0; i<C; i++)
{
char c;
cin >> c;
v.push_back(c);
}
sort(v.begin(), v.end());
func(0, 0);
return 0;
}
백트래킹을 이용한 문제이다.
처음에 문자를 입력받고 해당 문자를 입력받은 벡터의 사이즈만큼 반복문을 돌려서 백트래킹을 해준다.
이때 현재 인덱스의 다음값 뿐만이 아니라, 사이즈도 +1하여 같이 넘겨주는데 해당 사이즈가 주어진 L과 같아지면 자음과 모음에 대한 체크를 시작한다.
백트래킹 시에 문자를 또 따로 담아줬던 벡터 result를 기준으로 모음과 자음에 대한 갯수를 체크하고, 문제에서 주어진 조건인 최소 1개의 모음과 최소 2개의 자음으로 구성된 것이 맞다면 해당 벡터에 담겨진 문자들을 출력해준다.
'백준 > 골드' 카테고리의 다른 글
[백준 1351번] 무한 수열 (C++) (0) | 2023.09.04 |
---|---|
[백준 1229번] 육각수 (C++) (0) | 2023.09.02 |
[백준 10942번] 팰린드롬? (C++) (0) | 2023.08.27 |
[백준 2467번] 용액 (C++) (0) | 2023.08.26 |
[백준 2166번] 다각형의 면적 (C++) (0) | 2023.08.25 |