※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 1759번 문제인 암호 만들기이다.
문제는 아래 링크를 확인하자.

www.acmicpc.net/problem/1759

 

1759번: 암호 만들기

첫째 줄에 두 정수 L, C가 주어진다. (3 ≤ L ≤ C ≤ 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다.

www.acmicpc.net

이 문제는 조건(모음의 개수가 1개 이상일 것, 자음의 개수가 2개 이상일 것)을 만족시키는 모든 경우를 순열을 재귀적으로 탐색하며 모두 출력하면 되는 문제이다.

 

모든 순열을 탐색하면서, 주어진 길이가 되었을 때, 출력하기 전 자음과 모음의 개수가 각각 1개, 2개 이상인지를 확인해 주자.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using std::cin; using std::cout;
using std::sort;
using std::string;
using std::vector;

vector<char> letters;
string s;

int L, C;
int consonant = 0, vowel = 0;

void func(int index, vector<char>::iterator i) {
    if (s.length() == L and consonant>1 and vowel>0) cout << s << '\n';
    else if (i!=letters.end()){
        if (*i == 'a' or *i == 'e' or *i == 'i' or *i == 'o' or *i == 'u') vowel++;
        else consonant++;
        s.push_back(*i);
        func(index + 1, i + 1);
        s.pop_back();
        if (*i == 'a' or *i == 'e' or *i == 'i' or *i == 'o' or *i == 'u') vowel--;
        else consonant--;
        func(index + 1, i + 1);
    }
}

int main()
{
    cin >> L >> C;
    char temp;
    for (int i = 0;i < C;i++) {
        cin >> temp; letters.push_back(temp);
    }
    sort(letters.begin(), letters.end());
    vector<char>::iterator iter = letters.begin();
    func(0, iter);

    return 0;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 11275 // C++] 트리의 부모 찾기  (0) 2021.03.24
[BOJ 1915 // C++] 가장 큰 정사각형  (0) 2021.03.23
[BOJ 1789 // C++] 수들의 합  (0) 2021.03.21
[BOJ 2563 // C++] 색종이  (0) 2021.03.20
[BOJ 10610 // C++] 30  (0) 2021.03.19

+ Recent posts