백트래킹 연습하기 #1
이전에 스택을 이용해 permutation을 구현한 코드처럼 C개의 문자중에서 L개를 뽑는 경우를 모두 출력하는 문제이다
추가된 조건들
-
암호를 이루는 알파벳이 암호에서 증가하는 순서로 배열되어있을 것
-
암호를 이루는 알파벳은 모음을 최소 1개 가져야 하고, 자음을 최소 2개 가져야 한다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int L, C;
vector<char> str;
char ret[16];
bool visit[16] = {false, };
// 현재 문자가 모음이면 true
bool is_vowel(char c){
if(c=='a'||c=='e'||c=='i'||c=='o'||c=='u') return true;
else return false;
}
void dfs(int pos, int d, int vow, int con){
if(d == L){
if(vow == 0 || con < 2) return;
for(int i = 0; i < L; i++){
cout << ret[i];
}
cout << "\n";
return;
}
//str[0] 부터 str[C-1]까지 탐색
for(int i = pos; i < C ; i++){
if(visit[i]) continue; //방문했을경우 다음 글자로 넘어감
ret[d] = str[i]; // 결과가 될 현재 깊이 위치에 str의 문자를 입력
if(is_vowel(ret[d])) vow++; //모음과 자음의 갯수를 카운팅
else con++;
visit[i] = 1;
dfs(i+1, d+1, vow, con);
visit[i] = 0;
if(is_vowel(ret[d])) vow--; // 다시 빼주기
else con --;
}
}
int main(){
cin >> L >> C;
char c;
for(int i = 0; i < C; i++){
cin >> c;
str.push_back(c);
}
sort(str.begin(), str.end());
dfs(0, 0, 0, 0);
return 0;
}
|
cs |
'Algorithm > BOJ' 카테고리의 다른 글
[백준 17136] 색종이 붙이기 C++ (0) | 2021.04.30 |
---|---|
[백준 2661] 좋은 수열 C++ (0) | 2021.04.30 |
[백준 11404] 플로이드 C++ (2) | 2021.04.24 |
[백준 3109] 빵집 C++ (0) | 2021.04.22 |
[백준 12015] 가장 긴 증가하는 부분 수열2 C++ (1) | 2021.04.21 |