지나공 : 지식을 나누는 공간
[백준] 1759_암호 만들기 C++ 본문
next_permutation으로 조합을 구현했다.
주석 없는 코드
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
int main() {
vector<char> v;
vector<int>pick;
int l, c;
cin >> l >> c;
for (int i = 0; i < c; i++) {
char x;
cin >> x;
v.push_back(x);
pick.push_back(1);
}
sort(v.begin(), v.end());
for (int i = 0; i < l; i++) {
pick[i] = 0;
}
do {
string s = "";
for (int i = 0; i < c; i++) {
if (pick[i] == 0) {
s = s + v[i];
}
}
int cnt1 = 0;
int cnt2 = 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')
cnt1++;
else
cnt2++;
}
if (cnt1 < 1 || cnt2 < 2)
continue;
cout << s <<'\n';
} while (next_permutation(pick.begin(), pick.end()));
}
주석 있는 코드
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
int main() {
vector<char> v; //실제 char을 넣을 벡터
vector<int>pick; //next_permutation을 위한 벡터
int l, c;
cin >> l >> c;
for (int i = 0; i < c; i++) {
char x;
cin >> x;
v.push_back(x);
pick.push_back(1);
}
sort(v.begin(), v.end()); //정렬된 채로 뽑는댔으니까
//뽑으려는 문자 개수에 맞게 pick을 바꿔주자.
//pick을 0 0 0 0 1 1 로 만들어서 pick에서 0을 가진 위치에 해당되는 4개의 v[i]를 뽑을 것이다.
for (int i = 0; i < l; i++) {
pick[i] = 0;
}
do {
string s = "";
for (int i = 0; i < c; i++) {
if (pick[i] == 0) {
s = s + v[i];//뽑은 문자 조합을 string으로 받기
}
}
int cnt1 = 0;//모음 개수
int cnt2 = 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')
cnt1++;
else
cnt2++;
}
if (cnt1 < 1 || cnt2 < 2) //조건에 안 맞으면 출력 안하고 넘어가기
continue;
cout << s <<'\n';
} while (next_permutation(pick.begin(), pick.end()));
}
728x90
'Algorithm > 백준' 카테고리의 다른 글
[백준 2805번] 나무자르기_C++ 이분탐색 & DP (0) | 2021.02.25 |
---|---|
[백준 1063번] 킹 _C++_풀이 (0) | 2021.02.24 |
[백준] 7571_점 모으기_C++ 풀이, 시간초과 해결하기 (0) | 2021.01.19 |
[백준] 4796번_캠핑 C++ 풀이 (0) | 2021.01.11 |
Comments