반응형

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

 

2922번: 즐거운 단어

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

www.acmicpc.net

 

s[idx]가 알파벳이라면, 연속된 자음과 모음 개수를 업데이트하고, 알파벳이 'L'인지 확인해줍니다.
확정된 알파벳이므로 지금 흐름에서 경우의 수의 변동은 없습니다.

s[idx]가 '_'이라면, 세 가지 상황으로 나뉘게 됩니다.
1. '_'가 모음인 경우
연속된 모음 개수를 업데이트해주고, 연속된 자음 개수는 0으로 초기화해줍니다.
'L' 포함 여부는 그대로 전달되고, 모음은 5개이므로 경우의 수는 * 5가 됩니다.
2. '_'가 'L'이 아닌 자음인 경우
연속된 자음 개수를 업데이트해주고, 연속된 모음 개수는 0으로 초기화해줍니다.
'L' 포함 여부는 그대로 전달되고, 'L'을 제외한 자음은 20개이므로 경우의 수는 * 20이 됩니다.
3. '_'가 'L'인 경우
연속된 자음 개수를 업데이트해주고, 연속된 모음 개수는 0으로 초기화해줍니다.
'L' 포함 여부는 true로 고정되고, 경우의 수의 변동은 없습니다.

 

#include <iostream>
using namespace std;

typedef long long ll;

string s;
ll cnt = 0;

bool isMo(char ch) {
	return ch == 'A' || ch == 'E' || ch == 'I' || ch == 'O' || ch == 'U';
}

bool isJa(char ch) {
	return !isMo(ch);
}

void dfs(int idx, int mo, int ja, bool l, ll c) {
	if (mo >= 3 || ja >= 3) return;
	if (idx == s.size()) {
		if (l) cnt += c;
		return;
	}

	if (s[idx] == '_') {
		dfs(idx + 1, mo + 1, 0, l, c * 5);
		dfs(idx + 1, 0, ja + 1, l, c * 20);
		dfs(idx + 1, 0, ja + 1, true, c);
	}
	else {
		dfs(idx + 1, isMo(s[idx]) ? mo + 1 : 0, isJa(s[idx]) ? ja + 1 : 0, l || s[idx] == 'L', c);
	}
}

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

	cin >> s;
	dfs(0, 0, 0, false, 1);
	cout << cnt;
}
반응형

'Algorithm' 카테고리의 다른 글

백준 16947 : 서울 지하철 2호선  (0) 2021.11.17
백준 14938 : 서강그라운드  (0) 2021.11.17
백준 1600 : 말이 되고픈 원숭이  (0) 2021.11.16
백준 20164 : 홀수 홀릭 호석  (0) 2021.11.16
백준 2045 : 마방진  (0) 2021.11.16

+ Recent posts