PS/BOJ

[백준 C++] 1759 암호 만들기

포뇨링 2023. 3. 10. 12:28

https://www.acmicpc.net/problem/1759

 

1759번: 암호 만들기

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

www.acmicpc.net

 

 

 

치킨배달과 굉장히 비슷한 문제라고 느껴진다.

https://chhggg.tistory.com/28

 

[백준 C++] 15686 치킨 배달

https://www.acmicpc.net/problem/15686 15686번: 치킨 배달 크기가 N×N인 도시가 있다. 도시는 1×1크기의 칸으로 나누어져 있다. 도시의 각 칸은 빈 칸, 치킨집, 집 중 하나이다. 도시의 칸은 (r, c)와 같은 형태

chhggg.tistory.com

이제 위 문제와 좀 다른 점은 자음/모음개수를 신경 써 줘야한다는 것밖에 없다. 그만큼 코드도 굉장히 유사하다.

 

 

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
ll L, C;
vector<char> alpha;
string str;
ll vo_count;

ll vo(char tmp) { //모음이면 1반환
	if (tmp == 'a' || tmp == 'e' || tmp == 'i' || tmp == 'o' || tmp == 'u') {
		return 1;
	}
	return 0;
}

void search(ll idx) {
	ll cnt = alpha.size();
	if (str.length()==L){
		if (vo_count != 0 && vo_count <= L-2) {
			cout << str << '\n';
		}
		return;
	}
	else {
		for (ll i = idx; i < cnt; i++) {
			str += alpha[i];
			vo_count += vo(alpha[i]);
			search(i + 1);
			str.pop_back();
			vo_count -= vo(alpha[i]);
		}
	}

}

int main(void) {
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin >> L >> C;

	//input
	for (ll i = 0; i < C; i++) {
		char tmp;
		cin >> tmp;
		alpha.push_back(tmp);
	}

	sort(alpha.begin(), alpha.end());

	search(0);


}