@@@ 알고리즘/백준 스터디

2922(즐거운 단어) - 해결

HTG 2021. 8. 26. 01:02
728x90

즐거운 단어

 

문제

상근이는 자신이 다니는 학교에서 영어단어를 가장 많이 외우고 있다. 그 비법은 바로 조기교육이었다.

상근이는 젖병을 물기도 전에 영어 단어를 외웠다. 따라서, 지금은 자리에 앉으면 사전을 만들 수 있을 정도로 많이 외우게 되었다.

더 이상 외울 단어가 없어진 상근이는 이제 단어를 만들기로 결심했다.

상근이는 단어는 두 종류, 즐거운 단어와 즐겁지 않은 단어로 분류할 수 있다고 생각한다.

새로운 단어를 만들기 위해 즐겁지 않은 단어를 공책에 적는다. 그 다음, 보기 싫은 알파벳을 지우개로 지우고 그 자리에 밑 줄(_)을 적는다.

이렇게 보기 싫은 단어를 모두 지운 다음에는 즐거운 단어를 만들 수 있도록 밑 줄에 알파벳을 적는다.

상근이에게 즐거운 단어란, 모음(A,E,I,O,U)이 연속해서 3번, 자음(모음을 제외한 나머지 알파벳)이 연속해서 3번 나오지 않아야 한다.

또, L을 반드시 포함해야 한다.

상근이게 보기 싫은 알파벳을 지운 단어가 주어졌을 때, 즐거운 단어를 만들 수 있는 경우의 수를 세는 프로그램을 작성하시오.

 

입력

첫째 줄에 상근이가 공책에 적은 단어가 주어진다. 단어의 길이는 최대 100이고, 알파벳 대문자와 밑 줄(_)로만 이루어져 있다. 단어에 포함된 밑 줄의 개수는 최대 10이다.

 

출력

첫째 줄에, 밑 줄을 알파벳으로 바꿔 즐거운 단어를 만들 수 있는 경우의 수를 출력한다.


처음 생각한 방법이 모든 경우의 수를 생각해서 되는 경우에 횟수를 더하는 방법.

그 방법에서 _를 채우는 방법을 L, 자음, 모음 3가지로 나눠서 생각. 그래서 채워 넣는 걸 L, B, A로 채워 넣음.

그래서 모든 경우는 저 3가지 경우를 조합으로 구한다.

그래서 L, B, A 를 각각 _ 만큼 준비하고 그걸 _ 개의 조합을 구한다.

그리고 되는 word를 구해서 L은 1개, B는 자음 20개, A는 모음 5개로 되는 횟수를 더한다.

import sys
from itertools import permutations, combinations
word = list(sys.stdin.readline().strip())

# _ 갯수
N = word.count("_")
# _ 인덱스를 찾기 위해서
a = -1
idx_s = []
for _ in range(N):
    a = word.index("_",a+1)
    idx_s.append(word.index("_",a))

# 나중에 곱하기 위해서
numdict = {"L" : 1,"A": 5,"B":20}
# 총 할 수있는 경우를 다 하기위해서 각각을 N개 만큼 필요함
choice = ["L","A","B"] * N
# 할 수 있는 perm 구하고 중복 제외
perlist = list(set(combinations(choice,N)))

# 총 횟수를 저장
total = 0

# 길이가 3 이상 일 때
if len(word) >= 3:
    # 각 perm를 다 해서
    for per in perlist:
        # perm를 word에 채우기
        for i in range(N):
            word[idx_s[i]] = per[i]
        # L이 없으면 다음
        if "L" not in word:
            continue

        # 확인
        ck = True
        for i in range(len(word)-2):
            # 자음 3개
            if word[i + 2] not in ["A","E","I","O","U"] and word[i + 1] not in ["A","E","I","O","U"] and word[i] not in ["A","E","I","O","U"]:
                ck = False
                break
            # 모음 3개
            if word[i + 2] in ["A","E","I","O","U"] and word[i + 1] in ["A","E","I","O","U"] and word[i] in ["A","E","I","O","U"]:
                ck = False
                break
        # 무사히 통과하면
        if ck:
            sum = 1
            # 각 문자에 해당하는 숫자만큼 곱하기
            for i in range(N):
                sum *= numdict[per[i]]
            total += sum
# 길이가 2일때
elif len(word) == 2:
    # _ 하나 L 하나
    if N == 1 and "L" in word:
        total = 26
    # _ 하나 다른 문자 하나
    elif N == 1 and "L" not in word:
        total = 1
    # _ 두개
    elif N == 2:
        total = 51
# 길이가 1일때 즉, _ 만 있을 때
else:
    total = 1
print(total)