어흥

[백준 2922] 즐거운 단어 (C++) 본문

알고리즘/백준

[백준 2922] 즐거운 단어 (C++)

라이언납시오 2021. 3. 9. 18:20
728x90
반응형

문제 링크: www.acmicpc.net/problem/2922

 

2922번: 즐거운 단어

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

www.acmicpc.net

1. 주의할 점

- 정답은 Long Long 형태다

- 그리디한 방법으로 접근한다

- 모음↔L↔L이 아닌 자음 총 3가지의 경우를 두고 한다

 

2. 구현

- Dfs() 함수를 통해 시작하며, 매개변수로는 현재 index 번호, 연속된 모음의 수, 연속된 자음의 수, L의 여부, 현재까지의 형태로 진행될 수 있는 수가 차례대로 입력된다

- 입력받은 Str에 대해 모든 탐색이 끝났고, L이 있었다면 Result에 Cnt만큼 더해주고 리턴한다

- 현재 문자가 '_'일 때, 이번 칸에 모음이 들어올 수 있다면 모음 진행. 자음도 들어올 수 있다면, 자음도 진행한다. 단, L과 L을 포함하지 않는 자음으로 나눈다

- 현재 문자가 모음이며, 이전까지 연속된 모음이 2개가 아니라면 다음 문자로 진행한다

- 현재 문자가 자음이며, 이전까지 연속된 자음이 2개가 아니라면, 다음 문자로 진행한다. 단, 이때도 현재 문자가 L인지 L이 아닌 자음인지 구분한다

#include <iostream>
#include <string>
using namespace std;
long long result=0,len;
string str;

void dfs(int idx, int m, int j, bool l, long long cnt){
    if(idx==len){
        if(l)    result+=cnt;      
        return;
    }
    char c = str[idx];
    if(c=='_'){
        bool mavail=true;
        bool javail=true;
        if(m==2)  mavail=false;
        if(j==2) javail=false;
        if(mavail)  dfs(idx+1,m+1,0,l,cnt*5);
        if(javail){
            dfs(idx+1,0,j+1,true,cnt);
            dfs(idx+1,0,j+1,l,cnt*20);
        }
    }
    else if(c=='A' || c=='E' || c=='I' || c=='O' || c=='U'){
        if(m==2) return;
        dfs(idx+1,m+1,0,l,cnt);
    }
    else{
        if(j==2) return;
        if(c=='L') dfs(idx+1,0,j+1,true,cnt);
        else dfs(idx+1,0,j+1,l,cnt);
    }
}

int main() {
    cin>>str;
    len = str.size();
    dfs(0,0,0,false,1);
    cout<<result;
    return 0;
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 2437] 저울 (C++)  (0) 2021.03.11
[백준 15809] 전국시대 (C++)  (0) 2021.03.11
[백준 20061] 모노미노도미노 2 (C++)  (0) 2021.03.03
[백준 1561] 놀이 공원 (C++)  (3) 2021.02.25
[백준 3745] 오름세 (C++)  (0) 2021.02.25
Comments