BOJ 1759パスワードの作成


https://www.acmicpc.net/problem/1759
2秒、128 MBメモリ
input :
  • L, C (3 ≤ L ≤ C ≤ 15)
  • 文字が空白に分割されます.与えられた文字は小文字で、重複はありません.
  • output :
  • 可能なすべてのパスワードを出力
  • 条件:
  • は、少なくとも1つの母音(a、e、i、o、u)および少なくとも2つの補音からなる
  • である.
  • のパスワードを構成するアルファベットは、パスワードの増加順に
  • 並べられている.
    まず入力したアルファベットを子音、母音に分けます.
    for item in alpha:
        if item in ('a', 'e', 'o', 'i', 'u'):
            a.append(item)
        else:
            b.append(item)
    やっぱりinは気持ちいい
    また,暗号の構成は最低1母音,最低2子音である.
    したがって,母音の個数は1より大きくなければならないので,母音リストから複合音を求める場合は,1以上から母音リストの長さに従って抽出しなければならない.
    子音については、少なくとも2つが必要であるため、暗号長lは、抽出された母音の個数iを減算し、2以上である.
    for i in range(1, len(a) + 1):
        for mouem in combinations(a, i):
            if l - i >= 2:
                for jauem in combinations(b, l - i):
                    temp = mouem + jauem
                    temp = sorted(temp)
                    temp = "".join(temp)
                    ret.add(temp)
    そしてretはsetにして、繰り返さないようにします.
    最後にretを揃えて印刷します.
    import sys
    from itertools import combinations
    
    l, c = map(int, sys.stdin.readline().split())
    alpha = list(sys.stdin.readline().split())
    a = []
    b = []
    ret = set()
    
    for item in alpha:
        if item in ('a', 'e', 'o', 'i', 'u'):
            a.append(item)
        else:
            b.append(item)
    
    for i in range(1, len(a) + 1):
        for mouem in combinations(a, i):
            if l - i >= 2:
                for jauem in combinations(b, l - i):
                    temp = mouem + jauem
                    temp = sorted(temp)
                    temp = "".join(temp)
                    ret.add(temp)
    ret = sorted(ret)
    for i in ret:
        print(i)