Algorithm/BOJ

[BOJ - Gold IV] 즐거운 단어 / ❌

cks._.hong 2024. 8. 22. 16:32

즐거운 단어

1. 제출 코드 (2시간 32분 46초 / DFS)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    static String input;
    static long answer = 0;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        input = br.readLine();
        dfs(0, 0, 0, false, 1);
        System.out.println(answer);
    }

    public static void dfs(int idx, int mo, int ja, boolean l, long count) {
        if(mo >= 3 || ja >= 3) return;
        if(idx == input.length()) {
            if(l) answer += count;
            return;
        }
        char t = input.charAt(idx);
        if(t == '_') {
            dfs(idx + 1, mo + 1, 0, l, count*5);
            dfs(idx + 1, 0, ja + 1, l, count*20);
            dfs(idx + 1, 0, ja + 1, true, count);
        } else {
            if(t == 'A' || t == 'E' || t == 'I' || t == 'O' || t == 'U') {
                dfs(idx + 1, mo + 1, 0, l, count);
            } else {
                if(t == 'L') dfs(idx + 1, 0, ja + 1, true, count);
                dfs(idx + 1, 0, ja + 1, l, count);
            }
        }
    }
}

 

2. 구현 로직

t가 알파벳이라면 각 자음과 모음의 개수를 업데이트하고 L의 여부를 업데이트한다. 확정된 알파벳으로 count의 변화는 없다.

 

만약, t가 "_"일 경우에는 3가지 경우의 수로 나눠진다.

1. "_"가 모음인 경우

모음 개수를 업데이트하고 자음의 개수는 0으로 초기화하며 count는 모음의 개수를 곱해준다.

 

2. "_"가 자음인 경우

자음 개수를 업데이트하고 모음의 개수는 0으로 초기화하며 count는 자음의 개수 - 1을 곱해준다. L은 따로 처리하기 때문에 -1을 해준다.

 

3. "_"가 L인 경우 

자음 개수를 업데이트하고 모음의 개수는 0으로 초기화하며 count는 그대로이며 L을 true로 변경한다.

 

3. 유의할 점

  • 경우의 수를 처리할 때, L의 여부를 고민하여 처리해야 될 거 같다.