https://www.acmicpc.net/problem/1759
1759번: 암호 만들기
첫째 줄에 두 정수 L, C가 주어진다. (3 ≤ L ≤ C ≤ 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다.
www.acmicpc.net
빽트랙킹 . . 조합 . . .
#include <iostream>
#include <algorithm>
#include<vector>
#include <string>
using namespace std;
int l, c;
string s ;
bool isvisted[16];
void dfs(int cnt, int idx)
{
if (cnt == l)
{
//base condition
// 모음 하나 자음 두개 사전순
int m = 0, j = 0;
for (int i = 0; i < s.size(); i++)
{
if (visited[i])
{
if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u')
m++;
else
j++;
}
}
if (m >= 1 && j >= 2)
{
for (int i = 0; i < s.size(); i++)
{
if (visited[i])
cout << s[i];
}
cout << '\n';
}
return;
}
for (int i = idx; i < s.size(); i++)
{
if (visited[i] == false)
{
visited[i] = true;
dfs(cnt + 1, i);
visited[i] = false;
}
}
return;
}
int main()
{
cin >> l >> c;
for (int i = 0; i < c; i++)
{
char temp;
cin >> temp;
s += temp;
}
sort(s.begin(), s.end());
dfs(0, 0);
return 0;
}
빽트랙킹으로 풀은거 . . 정렬을 한 번 시켜주면 dfs 돌릴 땐 정렬 신경 안 써도 된다는 점이 가슴을 참 아프게 함
이건 조합으로
#include <iostream>
#include <algorithm>
#include<vector>
#include <string>
using namespace std;
int l, c;
vector<int > visit;
vector<char> alpa ;
int main(){
cin >> l >> c ;
for(int i=0; i< c; i++){
char temp;
cin >> temp;
alpa.push_back(temp);
visit.push_back(1);
}
sort(alpa.begin(), alpa.end());
for(int i=0; i< l; i++){
visit[i] = 0;
}
do{
string s ="";
for(int i=0; i< c; i++){
if(visit[i] ==0)
s+= alpa[i];
}
int m=0, j=0;
for(int i=0; i< s.size(); i++){
if(s[i] =='a'||s[i] =='e'||s[i] =='i'||s[i] =='o'||s[i] =='u') m++;
else j++;
}
if(m >=1 && j>=2){
cout << s <<'\n' ;
}
}while (next_permutation(visit.begin(), visit.end())) ;
}
이건 조합으로 next_permutation 참 좋다
성능은 둘다 비슷 ~
'코딩테스트 준비' 카테고리의 다른 글
15686 치킨배달 c++ (0) | 2021.10.01 |
---|---|
range based for (0) | 2021.10.01 |
9093_단어뒤집기 c++백준 (0) | 2021.05.28 |
백준 1152_단어의개수 c++ (0) | 2021.05.25 |
Summer/Winter Coding(~2018)소수 만들기_c++ (0) | 2021.05.06 |