백준 1759 - 암호 만들기
생각 및 접근
각 줄에 하나씩, 사전식으로 가능성 있는 암호를 모두 출력한다.
라는 말에서, DFS 방식으로 풀면 되겠다는 생각을 했다.- 암호의 재료가 되는 문자들을 sort한 뒤 DFS를 하면, L개만큼 고른 뒤의 그 문자열을 보면 모두 사전식일 것이다.
- 암호의 재료가 되는 문자들을 받은 뒤에, 그 문자들로 DFS를 진행하면 된다. 단, 내가 원하는 만큼 골랐을 때(문제에서는 L만큼 골랐을 때) 자음과 모음의 갯수를 세서 암호의 가능성이 있는 문자열인지 확인해야 한다.
코드
#include <bits/stdc++.h>
using namespace std;
vector<char> v;
vector<int> visit;
int l, c;
char temp;
void dfs(int len, int idx){
if(len == l){
int con = 0, vow = 0;
for(int i = 0; i < v.size(); i++){
if(visit[i] == 1){
if(v[i] == 'a' || v[i] == 'e' || v[i] == 'i' || v[i] == 'o' || v[i] == 'u')
vow++;
else
con++;
}
}
if(con >= 2 && vow >= 1){
for(int i = 0; i < v.size(); i++){
if(visit[i] == 1)
cout << v[i];
}
cout << endl;
}
}
else{
for(int i = idx; i < v.size(); i++){
visit[i] = 1;
dfs(len + 1, i + 1);
visit[i] = 0;
}
}
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> l >> c;
for(int i = 1; i <= c; i++){
cin >> temp;
v.push_back(temp);
}
sort(v.begin(), v.end());
visit.assign(v.size(), 0);
dfs(0, 0);
}
채점 결과
'Coding Test > acmicpc' 카테고리의 다른 글
백준 2580 - 스도쿠 (c++) (0) | 2020.08.09 |
---|---|
백준 14502 - 연구소 (c++) (0) | 2020.08.07 |
백준 1074 - Z (c++) (0) | 2020.08.05 |
백준 14501 - 퇴사 (c++) (0) | 2020.08.05 |
백준 1339 - 단어 수학 (c++) (0) | 2020.08.04 |