明日勉強キャンプD+42


BAEKJOON NO.2941「クロアチア文字」


<質問>


入力した任意の文字列を次の表に対応するクロアチア語に変換し、文字列の長さを出力すればよい.(クロアチア文字はdžもしそうであれば、2の長さではなく1の長さで計算し、変換されていない文字は1の長さで計算します.)

<解答>


  • クロアチア文字を区別する.
    [正規式]

  • p = re.compile('(d)?([a-z])([=j-])')
    (d)? : 最初の文字列は「d」でもなくてもよい.
    ([a-z]):2番目の文字列がアルファベット小文字で構成されているかどうかを確認します.
    ([=j-]):3番目の文字列が「=」、「j」、「-」であるかどうかを確認します.

  • k = p.findall(word)
    「word」変数に入力された文字列が正規表現(p:以上の条件)と一致していることを確認します.
    対応する文字をkにリスト形式で格納します.(findall:正規式と組み合わせて、リストに戻ります.)

  • クロアチア文字が正しいかどうかを比較して計算します
    [リスト(k)とクロアチア文字を比較する]
  • if
    「dz=」があるかどうかを確認し、ある場合は「count+=2」を表示します.
  • elif
    クロアチア文字(c=、c-、d-、lj、nj、s=、z=)と比較して「count+=1」を行います.
  • 文字列出力の計算.
  • 「dz=」が「d」ž「変換すると、既存の文字列の長さは3から1になります.(count+=2)
  • 「dz=」を除き、クロアチア文字の文字列長は2~1です.(count += 1)
  • アルゴリズム:「len(word)-count」と入力した文字列の長さを変換し、対応するcount値を減算すると、変換後の文字列の長さが得られます.
  • 合成コードの表示

    import re
    alphabet_list = ["c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="]
    
    word = input()
    count = 0
    
    p = re.compile('(d)?([a-z])([=j-])')
    k = p.findall(word)
    
    for i in k:
        print("i = ", i)
        alphabet = i[0] + i[1] + i[2]
    
        if alphabet == "dz=":
            count += 2
            print("조건1 = ", alphabet[1:2])
    
        elif i[1] + i[2] in alphabet_list:
            count += 1
            print("조건2 = ", i[1] + i[2])
    
    print(len(word) - count)
    ※問題解決後に他の解法を探すとより簡潔なコードが見つかりました.
    import re
    print(len(re.sub("(dz=|c=|c-|d-|lj|nj|s=|z=)", "0", input())))
  • input()から受信した文字列のうち、re.sub()に「(dz=|c=|d-|d-|lj|nj|s=|z=)」の文字が含まれている場合は、これを「0」に変換し、len()を使用して長さを計算します.
  • 学んだ部分。

  • 正規式は必要な部分コードのみを用い,この問題により正規式の記述方法と使用方法をよりユニークにした.
  • 残念なことに,
  • の正規式理論をもう少し広く見るとsub()のような関数がわかり,より容易に解決できる.