[백준/BOJ] 백준 2922번 : 즐거운 단어

2021. 2. 19. 21:44알고리즘 문제풀이

www.acmicpc.net/problem/2922

 

2922번: 즐거운 단어

상근이는 자신이 다니는 학교에서 영어단어를 가장 많이 외우고 있다. 그 비법은 바로 조기교육이었다. 상근이는 젖병을 물기도 전에 영어 단어를 외웠다. 따라서, 지금은 자리에 앉으면 사전을

www.acmicpc.net

밑줄에 모음을 넣는 경우, L을 제외한 자음을 넣는 경우, L을 넣는 경우 이렇게 3가지로 나눠서 문제를 해결했다. 모음을 넣는다고 할 때는 결과값에 모음의 개수 5를 곱하고, L을 제외한 자음을 넣는다고 할 때는 결과값에 20(자음(21개)-L(1개))을 곱하고, L을 넣는다고 할때는 결과값에 1을 곱해서 문제를 해결했다.

 

코드

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;

string input;

long long Solve(int mo_num, int ja_num, int L_num, int index)
{
	if (mo_num >= 3) //모음이 연속해서 3번 이상일때
		return 0;
	if (ja_num >= 3) //자음이 연속해서 3번 이상일때
		return 0;

	//글자를 모두 다 만들었을때
	if (index == input.size())
	{
		if (L_num == 0) //L이 포함되지 않았을때
			return 0;
		else
			return 1;
	}

	long long ret = 0;

	if (input[index] != '_') //_이 아닐때
	{
		if (input[index] == 'A' || input[index] == 'E' || input[index] == 'I' || input[index] == 'O' || input[index] == 'U')
			ret = Solve(mo_num + 1, 0, L_num, index + 1);

		else
		{
			if (input[index] == 'L')
				ret = Solve(0, ja_num + 1, L_num + 1, index + 1);

			else
				ret = Solve(0, ja_num + 1, L_num, index + 1);
		}
	}

	else
	{
		//_에 모음을 넣는 경우
		ret += (5 * Solve(mo_num + 1, 0, L_num, index + 1));

		//_에 자음을 넣는 경우
		ret += (20 * Solve(0, ja_num + 1, L_num, index + 1)); //자음21개-1개(L) = 20

		//_에 L을 넣는 경우
		ret += (1 * Solve(0, ja_num + 1, L_num + 1, index + 1));
	}

	return ret;
}

int main()
{
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);

	cin >> input;

	cout << Solve(0, 0, 0, 0);

	return 0;
}